【问题标题】:How can I have a model attribute persist between redirects?如何让模型属性在重定向之间保持不变?
【发布时间】:2019-08-12 14:50:01
【问题描述】:

我正在尝试为网站编写密码重置功能。我遇到了一个问题,我正在使用几个重定向来从 postmappings 转换到 getmappings 并且它们似乎没有携带它们需要的属性,即我试图重置密码表单的用户对象,here是我的一个映射的一个例子:

@PostMapping("/user/forgot")
    public String emailCheck (@RequestParam String email, Model model){
        User user = userDao.findByEmail(email);
        if (user==null){
            model.addAttribute("wrongEmail", true);
            return "redirect:/user/forgot";
        }
        else {
            model.addAttribute("user", user);
            return "redirect:/verifysecurity";
        }
    }

这是我然后调用用户属性的模板:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head th:replace="fragments/header :: header('Security', '')"></head>
<body>
    <div th:replace="fragments/navbar :: navbar"></div>
    <h1 th:if="${wrongAnswer}">Answer does not match record on file, please try again</h1>
    <h1>Please answer your security question: WHat is your best friends name?</h1>
    <form id="passwordForm" th:action="@{/verifysecurity}" th:method="post">
        <label for="answer">Answer</label>
        <br/>
        <input type="text" id="answer" name="answer"/>
        <input type="hidden" name="user" id="user" th:value="${user}"/>
        <input type="submit" class="btn btn-block btn-primary" value="Request"/>
    </form>
</body>
</html>

然后在之后的下一个映射中,我得到一个用户的空指针异常:

@PostMapping("/verifysecurity")
    public String verify (Model model, @RequestParam User user, @RequestParam String answer){
        String security = user.getSecurity_question();
        if (answer.equals(security)){
            model.addAttribute("user", user);
            return "redirect:/reset/password";
        } else {
            model.addAttribute("wrongAnswer", true);
            model.addAttribute("user", user);
            return "redirect:/verifysecurity";
        }
    }

我该如何解决这个问题,如果模型属性不起作用,我应该怎么做?

【问题讨论】:

  • 我提供的解决方案是否解决了您的疑问?你能达到预期的结果吗?请参阅What should I do when someone answers my question?。作为提问者,您有一项特殊的特权:您可以接受您认为是解决问题的最佳解决方案的答案。

标签: java spring-boot thymeleaf


【解决方案1】:

使用 spring RedirectAttributes.addFlashAttribute(),顾名思义,它存储在 flashmap 中,内部使用用户会话将此数据传递给下一个重定向,并删除使用的数据。

来自 spring 文档的示例:

@RequestMapping(value = "/accounts", method = RequestMethod.POST)
 public String handle(Account account, BindingResult result, RedirectAttributes redirectAttrs) {
   // Save account ...
   redirectAttrs.addFlashAttribute("message", "Account created!");
   return "redirect:/accounts/{id}";
 }

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2017-01-06
    • 2020-07-01
    相关资源
    最近更新 更多