Spring MVC 如何在Spring Boot 中通过Thymeleaf在两种方法之间传递数据

kx1ctssn  于 8个月前  发布在  Spring
关注(0)|答案(1)|浏览(85)

我正在创建一个重置密码页面,并且我有多个页面。在一个页面中,我从用户那里获取电子邮件,并使用model.addAttribute()将该值传递给另一个方法,我能够访问控制器中其他方法上的数据,在submot操作后,它显示为null;
控制器

@PostMapping("/verify")
    public String forgetPass(Model model,@ModelAttribute("login") Login login){
        if(otpServices.verify(login)){
            String newpass="";
            String email=login.getEmail();
            model.addAttribute("email",email);
            model.addAttribute("pass",newpass);
            return "NewPass";
        }else {
            return "ForgetPass";
        }
    }
    @PostMapping("/newpass")
    public String newPass(@ModelAttribute("email") String email, @ModelAttribute("pass") String pass ){
        userServices.updatePass(email,pass);
        return "Home";
    }

视图(百里香叶)

<form th:action="@{/newpass}" method="post" >
                <h2 class="text-center">New Password</h2>
                <div class="alert alert-success text-center" th:text="${email}">
                </div>
                <div class="alert alert-danger text-center">
                </div>
                <div class="form-group">
                    <input class="form-control" type="password" name="password" placeholder="Create new password" required th:field="*{pass}">
                </div>
                <div class="form-group">
                    <input class="form-control" type="password" name="cpassword" placeholder="Confirm your password" required>
                </div>
                <div class="form-group">
                    <input class="form-control button" type="submit" name="change-password" value="Change">
                </div>
            </form>

我还尝试使用对象并将值放入其中,并使用model.getAttribute手动访问数据,但每次值都为null;我将感谢任何帮助,因为我是新手;

vfwfrxfs

vfwfrxfs1#

模型属性只对一个请求有效

你尝试做的事情是不可能的。模型属性只在一个请求的生命周期内存在。当post to /verify完成时,所有的模型属性都消失了。最后访问它们的地方是在view/Thymeleaf页面。如果你想在一个请求之外持久化状态,你可以将数据放置到用户会话中,或者使用“flash属性”,它在后台做同样的事情。

设计注意事项

我认为你真的应该在一个方法中完成所有这些逻辑。如果验证失败,则返回一个响应,如果成功,则返回其他内容。用一个方法保存电子邮件和密码状态,然后用另一个方法实际持久化,这似乎是多余的。我建议你将验证放在/newPass方法中。
忘记密码应该是它自己的方法。/forgot-password可以接受一个电子邮件地址并发送一个电子邮件令牌。电子邮件中的令牌链接将用户带到一个表单,在那里他们发布到/new-password,该方法验证电子邮件是否是唯一的,如果不是,则保存它。

相关问题