【问题标题】:Persist information from controller to Thymeleaf and then send it to another controller (thymeleaf and Spring Boot将信息从控制器持久化到 Thymeleaf,然后将其发送到另一个控制器(thymeleaf 和 Spring Boot
【发布时间】:2020-03-31 15:21:29
【问题描述】:

我正在使用 Spring Boot 和 Thymeleaf 以恢复密码形式工作,该过程是后端使用令牌向用户发送链接,该令牌与用户信息一起保存在数据库中。用户单击链接,后端验证令牌,如果正确,它会将用户信息重定向到“新通行证”表单,用户必须在其中输入新密码并重复。当用户输入密码并按save时,它会将信息发送到后端,并使用userId搜索寄存器并更改密码。

在用户按下链接时验证令牌的控制器中,我搜索用户的信息并使用 userId 和密码构建和 usersRecoverPassDto,并组织模型对象以将其发送到“新通行证”像这样的形式:

PasswordManagmentPostDto passManagment = new PasswordManagmentPostDto();

passManagment.setUserId(userId);

model.addAttribute ("passInfo", passManagment);

在“新通行证”表格中我收到了正确的信息:

passInfo={
 userId: 123456,
 newPassword: null,
 repeatePassword: null
}

我编码的“新通行证”表格是这样的:

<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: null,
 newPassword: password,
 repeatePassword: password
}

userId 参数只是一个没有任何修改也没有显示的参数,但我不知道如何将这个值从控制器持久化到视图,然后到另一个控制器。

我在新的通行证表单中添加了另一个输入:

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

我没有对这个输入做任何事情,只需输入两个密码并按下保存按钮就可以了,我收到了带有正确信息的对象。

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

有人可以帮帮我吗?

非常感谢您

【问题讨论】:

    标签: spring-boot thymeleaf


    【解决方案1】:

    老答案

    使用hidden 输入:

    <input type="hidden" id="userId" name="userId" th:value="*{userId}" />
    

    这是 hidden 输入的一部分,用于维护应发送回控制器的数据,但用户不能查看/更改。

    新答案

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

    【讨论】:

    • 但是使用hidden,我可以检查页面(Chrome 为 F12),您可以获取 userId 并对其进行修改并修改查询以更改密码:&lt;input type="hidden" id="userId" name="userId" value="1234"&gt;
    • 正确。你不能保留userId 而不以某种方式在前端管理它。据我所知,这是不可能的。知道userId对某人有什么危害?
    • 但问题是我可以更改userId,当我按下保存按钮时,我可以更改另一个用户密码
    • 如果是修改当前登录用户的密码,只需在控制器中抓取当前用户的用户id即可。
    • 是不是在当前会话中更改密码,例如你尝试登录任何网站而你在登录页面,你忘记了密码,你按下了“忘记密码”按钮“,您提交您的邮件地址,他们会向您发送一封电子邮件,其中包含一个链接以恢复您的密码,因此您输入新密码并在数据库中修改密码,因此在恢复密码过程中您没有登录。跨度>
    猜你喜欢
    • 2018-03-10
    • 2015-09-04
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2016-08-05
    • 2018-11-17
    相关资源
    最近更新 更多