问题描述
最近在使用SpringBoot写个人博客来练手
在使用RestFul风格来发送Put请求时,报错Request method ‘POST’ not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
在网上搜了普遍的解决方法,如下:
- 在配置文件中添加以下代码,开启HiddenHttpMethodFilter
spring.mvc.hiddenmethod.filter.enable=true
- 在表单中添加以下代码,修改请求方式
<form action="/admin/put" method="post">
<input name="_method" value="PUT" type="hidden">
<input type="submit" value="PUT提交"/>
</form>
但是以上的方法都没有解决我的问题,仍然报错“不支持POST请求”
后来我通过对源码进行断点分析,发现程序没有走SpringBoot自动配置类WebMvcAutoConfiguration中的OrderedHiddenHttpMethodFilter方法,而该方法正是让post请求包装成PUT、DELETE的核心方法。
前面已经通过配置spring.mvc.hiddenmethod.filter.enable=true开启了该方法,但是为什么没有起作用呢?
我注意到在自动配置类WebMvcAutoConfiguration上面有一句注解@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
我明白了,之前在做登录拦截的时候,编写了WebMvcConfiguration,该类继承了WebMvcConfigurationSupport,所以自己编写的WebMvcConfiguration类不能让SpringBoot的自动配置类起作用了。
解决办法
在自己编写的WebMvcConfiguration中配置OrderedHiddenHttpMethodFilter
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
//配置OrderedHiddenHttpMethodFilter
@Bean
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/user")
.excludePathPatterns("/css/**")
.excludePathPatterns("/img/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/lib/**");
}
}
问题解决!