【问题标题】:SpringBoot/MVC & Thymleaf form validation on POST with URL parameters带有 URL 参数的 POST 上的 Spring Boot/MVC 和 Thymeleaf 表单验证
【发布时间】:2015-07-06 12:38:49
【问题描述】:

我有一个表格和验证作品。添加 url 参数时出现问题。 url 参数是一个令牌并且是必需的。所以这就是我的控制器的样子:

@RequestMapping(value = "/resetpassword", method = RequestMethod.GET)
public String showResetForm(ResetPassword resetPassword, Model model,
        @RequestParam(value = "token", required = true) String token,
        @RequestParam(value = "msg", required = false) String msg){     

        model.addAttribute("token", token);

    return "resetpassword";
}

@RequestMapping(value = "/resetpassword", method = RequestMethod.POST)
public String setPwd(@ModelAttribute("resetPassword") @Valid ResetPassword resetPassword,// RedirectAttributes reDirectAttr,
                     BindingResult bindingResult, Model model,
                     @RequestParam(value = "token", required = true) String token,
                     @RequestParam(value = "msg", required = false) String msg){

    if (bindingResult.hasErrors()) {
            //reDirectAttr.addFlashAttribute("org.springframework.validation.BindingResult.resetPassword",bindingResult);
            //reDirectAttr.addFlashAttribute("resetPassword",resetPassword);            
        return "resetpassword?token="+token;
    } 
    else {          
        if (token == null) {
            // TODO: no token, what to do here??
            return "redirect:/resetpassword?token=\"\"&msg=notoken";
        }
        ResetPasswordResponseDto response = super.resetUserPassword(
                resetPassword.getUname(), resetPassword.getPassword(),
                token);
        if (response.getPasswordResetResult() == PasswordResetResult.SUCCESSFUL) {
            // TODO: it worked, what now?
            return "redirect:/login";
        } else if (response.getPasswordResetResult() == PasswordResetResult.INVALID_TOKEN) {
            // TODO: bad token
            return "redirect:/resetpassword?token="+token+"&msg=badtoken";
        } else if (response.getPasswordResetResult() == PasswordResetResult.OUT_OF_POLICY_PW) {
            // TODO: out of policy pw
            return "redirect:/resetpassword?token="+token+"&msg=outofpolicy";
        } else if (response.getPasswordResetResult() == PasswordResetResult.LDAP_FAILURE) {
            // TODO: other failure
            return "redirect:/resetpassword?token="+token+"&msg=error";
        }
    }
    return "redirect:/resetpassword?token="+token+"&msg=error";
    //return new RedirectView("resetpassword?token=\"\"&msg=notoken");
}

所以我尝试了很多东西,但似乎没有任何效果。这是请求视图时我希望发生的事情 /resetpassword?token=1232453 显示视图。然后,如果表单有错误,则 url 参数会保留在 url 中,并且表单会显示错误。现在我收到一条错误消息,提示无法解析模板。好吧,很公平,所以我尝试改用重定向

return "redirect:/resetpassword?token="+token;

这似乎可行,但是 URL 参数丢失并且视图丢失了 bindingResult 错误。在代码中,我发布了我也尝试了 FlashAttributes,但我只是收到一个错误“对象 ='resetPassword' 的验证失败。错误计数:4”这是正确的,但我需要它来显示表单和我用 Thymeleaf 编码的错误。任何帮助或建议都会很棒!

我看过的资源: Spring - Redirect after POST (even with validation errors) & SpringMVC controller: how to stay on page if form validation error occurs

【问题讨论】:

    标签: validation spring-mvc spring-boot thymeleaf


    【解决方案1】:

    您是否尝试过返回 ModelAndView 而不仅仅是重定向字符串?模型上的属性将作为 URL 查询参数提供。

    ModelAndView redirect = new ModelAndView("redirect:/resetpassword");
    redirect.addObject("token", token);
    redirect.addObject("msg", "error");
    return redirect;
    

    【讨论】:

    • 我最终将 model.addAttribute("token", token); 添加到 Post 请求方法中,这还需要在 <input type="hidden" name="token" th:value="${token}"/> 表单上添加隐藏表单字段,这对我来说似乎很麻烦。我想我会试试你的建议。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2017-11-28
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多