【发布时间】:2016-03-07 00:59:15
【问题描述】:
众所周知,表单只支持GET或POST方法,像这样:
<form method="[GET|POST]" action="/user/create">
如果我们的控制器有一个PUT 映射,我们会得到一个405 错误,这意味着我们只能使用GET 或POST 而不能使用PUT。
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/create", method = RequestMethod.PUT)
public ModelAndView createUser(@ModelAttribute("user") Users user, BindingResult bindingResult){
ModelAndView mv = new ModelAndView("list");
// do something...
return mv;
}
}
在spring MVC中,我们可以解决这个问题:
首先,像这样创建一个隐藏字段:
<form method="[GET|POST]" action="/user/create">
<input type="hidden" name="_method" value="put"/>
其次,添加过滤器
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
这样,我们就可以使用PUT方法了。
但是如何在 Spring Boot 中做到这一点?我知道 Spring Boot 有一个名为 WebMvcAutoConfiguration 的类,它拥有一个方法 hiddenHttpMethodFilter,但我该如何使用该类?
【问题讨论】:
-
你不需要做任何事情,因为 Spring Boot 会自动为你配置隐藏的 http 方法过滤器
-
@AndyWilkinson 非常感谢。我编辑了我的问题,但是如果我不配置隐藏的 http 方法过滤器,我该如何使用 html 表单中的 put 提交。
-
像往常一样。只需将元素放入表单中...
-
从 Spring Boot 2.2 开始,过滤器不再自动配置。在您的
application.properties中设置spring.mvc.hiddenmethod.filter.enabled=true以再次启用它。 -
请注意,使用
HiddenHttpMethodFilter会使您的应用程序面临一大堆新的 CSRF 攻击。确保您有其他方法可以阻止来自外部表单的请求。不,CORS 不适用于表单。
标签: java spring spring-mvc spring-boot