SpringBoot升级至3.2.1后POST请求报405 Method Not Allowed错误
解决SpringBoot 3.2.1中POST接口被识别为静态资源的问题
以下是针对你遇到问题的具体解决方案:
1. 调整Spring Security的CSRF配置
Spring Boot 3.x搭配的Spring Security 6.x默认开启CSRF保护,未携带CSRF Token的POST请求会被拦截,后续流程可能将请求导向静态资源处理器,最终返回405错误。
如果你的接口无需CSRF保护,可针对性关闭:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.ignoringRequestMatchers("/init/messageSimulator")) .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.POST, "/init/messageSimulator").permitAll() // 其他授权规则 ); return http.build(); }
若需保留CSRF保护,需在Postman请求中携带有效Token(可通过GET请求获取后添加到请求头或参数中)。
2. 修正WebMvc静态资源映射逻辑
你当前将/**映射到静态资源的配置会覆盖所有请求路径,虽然控制器映射优先级更高,但POST请求因静态资源处理器不支持该方法,会触发405错误。建议修改为更精准的映射,并单独配置SPA路由 fallback:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 仅映射/static/**路径到静态资源 registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } // 处理SPA路由:非接口、非静态资源的请求返回index.html @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/**") .setViewName("forward:/index.html"); } }
这样控制器的POST接口会被优先匹配,仅静态资源路径会被静态资源处理器处理。
3. 验证请求Content-Type与控制器映射
- 确保Postman中POST请求的
Content-Type与控制器方法的接收要求一致(比如application/json),否则Spring不会将请求路由到控制器。 - 检查控制器的
@PostMapping路径拼写是否完全匹配/init/messageSimulator,避免大小写或路径分隔符错误。
内容的提问来源于stack exchange,提问作者Eugen Gîrlescu
相关产品推荐
相关产品推荐

