Spring MVC Json 405 (Method Not Allowed)/ 404 Bad Request

本文介绍了如何解决SpringMVC框架下使用Ajax发送JSON数据时遇到的404和405错误。通过调整Ajax请求方式为POST并正确设置@RequestBody注解,同时确保SpringSecurity的token验证配置正确。

在spring mvc 框架下利用Ajax向后台发送Json格式数据,出现了404、405问题。

原因如下:

  1. 出现404,是因为Ajax的type设成了“GET”,但是@RequestBody注解不支持GET,只支持POST.
  2. 出现405,是因为框架添加了spring security, 凡是post方法都需要token验证。

具体配置如下:
ajax:

    <script type="text/javascript">
        var value=[];
        $(document).ready(function()
            {
                var token = $('#csrfToken').val();
                var header = $('#csrfHeader').val();

                var saveDataAry=[];  
                var data1={username:"test",email:"gz"};  
                var data2={username:"ququ",email:"gr"};  
                saveDataAry.push(data1);  
                saveDataAry.push(data2);

                $("#click").click(function(){
                    var link=$("#urlpath").val();
                    $.ajax(
                        {
                            url:link,
                            type:"POST", 
                            dataType:"json",
                            contentType:"application/json",  
                            data:JSON.stringify(saveDataAry),
                            beforeSend: function(xhr) {
                            xhr.setRequestHeader("Accept", "application/json");
                            xhr.setRequestHeader("Content-Type", "application/json");
                            xhr.setRequestHeader(header, token);
                            }
                        });
                });
            });
    </script>
<body>
<input type="hidden" id="csrfToken" value="${_csrf.token}"/>
<input type="hidden" id="csrfHeader" value="${_csrf.headerName}"/>
<input type="hidden" id="urlpath" value=<c:url value="/auth/json"/>>
</div>
    <button id="click">Click</button>
</body>

Controller

    @RequestMapping(value="/auth/json",method=RequestMethod.POST,consumes="application/json")  
    public @ResponseBody String getShopInJSON(@RequestBody List<TestUser>user) {

        System.out.println(user.get(0).getEmail());
        return "";
    }

TestUser

package com.user;

public class TestUser {
    private String username;
    private String email;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}
### Spring Boot中405 Method Not Allowed错误的调试方法 #### 1. 检查HTTP请求方法与后端接口是否匹配 确保前端发送的HTTP请求方法(如GET、POST、PUT、DELETE等)与后端控制器中定义的HTTP方法注解一致。例如,如果前端发送的是POST请求,则后端应使用`@PostMapping`注解[^2]。 ```java @RestController @RequestMapping("/api") public class ExampleController { @PostMapping("/example") // 确保与前端请求方法一致 public ResponseEntity<String> examplePost(@RequestBody Map<String, String> body) { return ResponseEntity.ok("POST request received"); } } ``` #### 2. 启用HiddenHttpMethodFilter以支持浏览器发送非标准HTTP方法 在Spring Boot中,默认情况下浏览器无法直接发送PUT或DELETE请求。可以通过启用`HiddenHttpMethodFilter`过滤器来解决此问题。在`application.properties`文件中添加以下配置[^2]: ```properties spring.mvc.hiddenmethod.filter.enabled=true ``` 启用后,浏览器可以使用隐藏字段`_method`来模拟PUT或DELETE请求。例如,在HTML表单中添加以下字段: ```html <form action="/api/example" method="post"> <input type="hidden" name="_method" value="put" /> </form> ``` #### 3. 检查Spring Security配置是否限制了HTTP方法 如果项目使用了Spring Security,需确保其配置未限制特定HTTP方法。例如,可以通过以下方式允许所有HTTP方法访问指定接口[^3]: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(HttpMethod.POST, "/api/example").permitAll() // 允许POST方法 .anyRequest().authenticated() .and() .csrf().disable(); } } ``` #### 4. 验证CORS配置是否允许指定HTTP方法 如果前后端分离部署,还需确保CORS配置允许前端域名访问后端接口,并明确允许的HTTP方法。例如,通过以下配置允许GET、POST、PUT和DELETE方法[^1]: ```java @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") // 前端运行地址 .allowedMethods("GET", "POST", "PUT", "DELETE"); } }; } ``` #### 5. 查看服务器日志以定位具体问题 通过查看后端服务器日志,可以进一步定位导致405错误的具体原因。日志中可能会显示接口路径、HTTP方法以及相关的安全限制信息[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值