Spring boot 将控制器中的信息持久化到Thymeleaf,然后将其发送到另一个控制器(Thymeleaf和Spring Boot)

Spring boot 将控制器中的信息持久化到Thymeleaf,然后将其发送到另一个控制器(Thymeleaf和Spring Boot),spring-boot,thymeleaf,Spring Boot,Thymeleaf,我正在使用Spring Boot和Thymeleaf的恢复密码表单中工作,过程是后端向用户发送一个带有令牌的链接,该令牌与用户信息一起保存在数据库中。用户单击该链接,后端验证令牌,如果正确,它将使用用户信息重定向到“新密码”表单,用户必须引入新密码并重复。当用户引入密码并按save时,它将信息发送到后端,并使用用户ID搜索注册表并更改密码 在用户按下链接时验证令牌的控制器中,我搜索用户信息,并使用userId和密码null构建和使用usersRecoverPassDto,并组织模型对象将其发送到

我正在使用Spring Boot和Thymeleaf的恢复密码表单中工作,过程是后端向用户发送一个带有令牌的链接,该令牌与用户信息一起保存在数据库中。用户单击该链接,后端验证令牌,如果正确,它将使用用户信息重定向到“新密码”表单,用户必须引入新密码并重复。当用户引入密码并按save时,它将信息发送到后端,并使用用户ID搜索注册表并更改密码

在用户按下链接时验证令牌的控制器中,我搜索用户信息,并使用userId和密码null构建和使用usersRecoverPassDto,并组织模型对象将其发送到“new pass”表单,如下所示:

PasswordManagmentPostDto passManagment = new PasswordManagmentPostDto();

passManagment.setUserId(userId);

model.addAttribute ("passInfo", passManagment);
<form action="#" th:action="@{/password/recovery}" th:object="${passInfo}" method="post">
  <div class="mb-2 mr-sm-2 mb-sm-0 position-reNew pass:</label>
    <input type="password" th:field="*{newPassword}" placeholder="Contraseña" class="form-control">
  </div>
  <div class="mb-2 mr-sm-2 mb-sm-0 position-relative form-group">
    <label for="repeatePass" class="mr-sm-2">Repeat pass:</label>
    <input type="password" th:field="*{repeatNewPassword}" placeholder="Repita contraseña" class="form-control"/>
  </div>

  <div class="mb-2 mr-sm-2 mb-sm-0 mt-3 position-relative form-group">
    <input name="submit" type="submit" value="Save" class="inputButton btn btn-success "/>
  </div>
</form>
在“新通行证”表格中,我收到了正确的信息:

passInfo={
 userId: 123456,
 newPassword: null,
 repeatePassword: null
}
“新通行证”表格I代码如下:

PasswordManagmentPostDto passManagment = new PasswordManagmentPostDto();

passManagment.setUserId(userId);

model.addAttribute ("passInfo", passManagment);
<form action="#" th:action="@{/password/recovery}" th:object="${passInfo}" method="post">
  <div class="mb-2 mr-sm-2 mb-sm-0 position-reNew pass:</label>
    <input type="password" th:field="*{newPassword}" placeholder="Contraseña" class="form-control">
  </div>
  <div class="mb-2 mr-sm-2 mb-sm-0 position-relative form-group">
    <label for="repeatePass" class="mr-sm-2">Repeat pass:</label>
    <input type="password" th:field="*{repeatNewPassword}" placeholder="Repita contraseña" class="form-control"/>
  </div>

  <div class="mb-2 mr-sm-2 mb-sm-0 mt-3 position-relative form-group">
    <input name="submit" type="submit" value="Save" class="inputButton btn btn-success "/>
  </div>
</form>
userId参数只是一个未经任何修改也未显示的参数,但我不知道如何将该值从控制器持久化到视图,然后再持久化到另一个控制器

我尝试向新的通行证表单添加另一个输入:

<input type="text" th:field="*{userId}" th:value="*{userId}" placeholder="userId" class="form-control"/>

我对这个输入什么也没做,只是输入了两个密码,然后按了保存按钮,它就工作了,我收到了带有正确信息的对象

当然,userId参数不能在表单中显示或修改

有人能帮我吗


提前非常感谢您

旧答案

使用
隐藏的
输入:


这是
隐藏的
输入的一部分,用于维护应发送回控制器的数据,但用户无法查看/更改

新答案


根据我们在评论中的讨论,似乎合适的方法是在前端保留用户的令牌。在提交表单时将该令牌传递给控制器,然后通过该令牌查找用户以重置密码。

旧答案

使用
隐藏的
输入:


这是
隐藏的
输入的一部分,用于维护应发送回控制器的数据,但用户无法查看/更改

新答案


根据我们在评论中的讨论,似乎合适的方法是将用户的令牌保留在前端。在提交表单时将该令牌传递给控制器,然后通过该令牌查找用户以重置密码。

但是使用
隐藏
,我可以检查页面(F12用于Chrome),您可以获取用户ID并对其进行修改,然后修改查询以更改密码:
正确。如果不在前端对其进行管理,您无法保留
用户ID
。据我所知,这是不可能的。知道
用户ID
有什么害处?但问题是我可以更改密码用户id,当我按下保存按钮时,我可以更改另一个用户密码如果这是要更改当前登录用户的密码,只需在控制器中获取当前用户的用户id。不是要在当前会话中更改密码,例如,您尝试登录到任何网站,并且您在登录页面中,您忘记了您r密码,你按下“忘记密码”按钮,你提交你的邮件地址,他们会给你发送一封电子邮件,其中包含一个链接来还原你的密码,这样你就可以输入新密码,并在数据库中修改密码,这样,在还原密码的过程中你就不会登录。但是,使用
隐藏
,我可以检查页面(F12的Chrome),您可以获取用户ID并对其进行修改,然后修改查询以更改密码:
正确。如果不在前端对其进行管理,您无法保留
用户ID
。据我所知,这是不可能的。知道
用户ID
有什么害处?但问题是我可以更改密码用户id,当我按下保存按钮时,我可以更改另一个用户密码如果这是要更改当前登录用户的密码,只需在控制器中获取当前用户的用户id。不是要在当前会话中更改密码,例如,您尝试登录到任何网站,并且您在登录页面中,您忘记了您r密码,您按下“忘记密码按钮”,提交您的邮件地址,他们会向您发送一封电子邮件,其中包含一个链接,用于恢复您的密码,以便您输入新密码,并在数据库中修改密码,以便在恢复密码过程中您不会登录。