【问题标题】:Spring sending object from view to a controllerSpring将对象从视图发送到控制器
【发布时间】:2021-09-15 00:30:15
【问题描述】:

如何将对象从视图发送到控制器?
我首先使用控制器 1 在使用 Thymeleaf 的视图 1 上显示此对象,该对象是 ${object}。然后我想要做的是单击一个按钮并将这个对象发送回控制器 2,以便我可以将同一对象从视图 1 显示到视图 2。你是怎么做到的,你能给我一个例子吗?

现在我可以使用 URL 中对象的 ID 来执行此操作,然后在控制器 2 中请求参数,然后根据 ID 获取对象。但是我不想在 URL 中看到对象 ID,还有什么方法?

【问题讨论】:

  • 对不起,这对我没有帮助,我说我已经可以使用 URL 中对象的 ID,然后使用 @PathVariable 提取它我要问的是如何传输在没有看到 ID 或 URL 中对象的任何内容的情况下查看控制器?
  • 看起来你有任何选择。您必须基于某些东西来获取对象。至少一个标识符。

标签: spring spring-boot model-view-controller view thymeleaf


【解决方案1】:

如果您不想在 URL 中使用 id,那么您可以创建一个带有隐藏字段的表单并将其提交给您的控制器。

<form th:object="${formData}" method="post">
  <input type="hidden" th:field="*{id}">
  <button type="submit">
</form>

使用这样的控制器:

@Controller
public class MyController {

  @GetMapping
  public String showPage(Model model) {
    model.addAttribute("formData", new MyFormData("someId"));

    return "myTemplate";
  }

  @PostMapping
  public String handleId(@ModelAttribute("formData") MyFormData formData) {
    String id = formData.getId();
    
    // do something with id here
  }
}

但您似乎对这个要求有点困难。您不想在 URL 中显示 id 的任何特殊原因?

【讨论】:

  • 我想阻止其他用户编辑其他用户的对象,例如,我有一个向用户添加书籍的表单 /addBook/{user_id} 我不希望其他用户使用其他用户的 URL id 为他添加书籍。有更好的做法吗?
  • 这种方法不能替代安全性。在浏览器中使用“查看源代码”时,他们可以看到隐藏输入的值。您需要为您的应用程序添加安全性(通常通过 Spring Security 用于 Spring Boot 应用程序)并通过 @AuthenticationPrincipal 检索登录用户。不要依赖 URL 中的用户 ID 或隐藏的输入来了解当前登录的用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多