AJAX POST调用Spring MVC接口遇405 Method Not Allowed错误求助
解决AJAX POST请求Spring MVC后端返回405 Method Not Allowed的问题
我太懂这种查了一堆资料还卡着的憋屈感了!咱们针对你的场景一步步排查可能的问题:
1. 检查控制器是否明确支持POST请求
这是最常见的坑——很多人写Spring MVC控制器时,忘了指定请求方法只支持POST,导致默认规则冲突时直接返回405。
- 错误示例(默认支持所有方法,但易受其他配置影响失效):
@RequestMapping("/save-payment-response") public ResponseEntity<String> savePayment(@RequestBody PaymentResponse response) { // 业务逻辑 } - 正确写法(用
@PostMapping直接指定,更清晰不易出错):
或者用@PostMapping("/save-payment-response") public ResponseEntity<String> savePayment(@RequestBody PaymentResponse response) { // 业务逻辑 }@RequestMapping显式声明方法:@RequestMapping(value = "/save-payment-response", method = RequestMethod.POST) public ResponseEntity<String> savePayment(@RequestBody PaymentResponse response) { // 业务逻辑 }
2. 排查跨域(CORS)问题
如果你的前端页面和后端API不在同一域名/端口,浏览器会先发送OPTIONS预检请求。如果后端没配置允许POST和OPTIONS方法,就会返回405。
- 快速解决:在控制器方法上添加
@CrossOrigin注解,允许前端域名的跨域请求:@CrossOrigin(origins = "http://your-frontend-domain.com", methods = {RequestMethod.POST, RequestMethod.OPTIONS}) @PostMapping("/save-payment-response") public ResponseEntity<String> savePayment(@RequestBody PaymentResponse response) { // 业务逻辑 } - 全局配置:如果多个接口都需要跨域,建议在Spring配置类里设置全局CORS规则,避免重复代码。
3. 确认请求URL完全匹配
别小看这个细节!打开浏览器开发者工具的Network标签,查看实际发送的请求URL,和控制器的映射路径完全对比——比如前端写的是/api/save-payment,控制器里是/save-payment,差个前缀就会请求到错误的处理器,直接返回405。
4. 检查Spring Security或过滤器的拦截
如果你的项目用了Spring Security,可能有两个点导致405:
- CSRF防护拦截:默认开启CSRF时,AJAX POST请求必须携带CSRF Token,否则会被拦截(有时返回403,也可能返回405)。解决方法是在AJAX请求里添加Token头:
// 先从页面meta标签获取CSRF Token(需要后端在页面渲染时注入) const csrfToken = document.querySelector('meta[name="_csrf"]').content; $.ajax({ url: '/save-payment-response', type: 'POST', headers: { 'X-CSRF-TOKEN': csrfToken }, data: JSON.stringify(paymentResponse), contentType: 'application/json', success: function(res) { // 处理成功逻辑 } }); - 请求方法限制:检查Security配置里是否有针对该路径的方法限制,比如只允许GET,需要改成允许POST:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/save-payment-response").permitAll() // 允许匿名访问(如果业务需要) .antMatchers(HttpMethod.POST, "/save-payment-response").permitAll(); // 明确允许POST方法 }
5. 验证请求格式与后端解析是否匹配
如果你的AJAX发送的是JSON数据,后端必须确保:
- 方法参数加上
@RequestBody注解,告诉Spring解析请求体为Java对象; - 项目里有Jackson依赖(Spring Boot默认已包含),能正确序列化/反序列化JSON格式。
如果以上步骤都排查过还是没解决,建议把你的完整控制器代码和AJAX请求代码贴出来,这样能更精准定位问题!
内容的提问来源于stack exchange,提问作者Anurag
相关产品推荐
相关产品推荐

