Spring将对象从视图发送到控制器

Posted

技术标签:

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

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

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

【问题讨论】:

javaguides.net/2019/04/… 对不起,这对我没有帮助,我说我已经可以使用 URL 中对象的 ID,然后使用 @PathVariable 提取它我要问的是如何传输在没有看到 ID 或 URL 中对象的任何内容的情况下查看控制器? 看起来你有任何选择。您必须基于某些东西来获取对象。至少一个标识符。 【参考方案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 或隐藏的输入来了解当前登录的用户。

以上是关于Spring将对象从视图发送到控制器的主要内容,如果未能解决你的问题,请参考以下文章

Spring 和 Thymeleaf:将对象从 th:each 表发送到控制器

如何在 Spring-MVC 中将数据从视图传递到控制器?

Swift 向视图控制器发送多个对象

将信息从视图发送到控制器

控制器从 Thymeleaf 发送空对象 - Spring Boot

如何使用ajax将数据从视图发送到控制器laravel?