You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot后端接收Unirest POST请求返回302状态码问题求助

解决Spring Boot POST接口返回302重定向的问题

我来帮你分析下这个302重定向的问题,这在Spring Boot结合Spring Security的场景里很常见,咱们一步步定位解决:

1. 最可能的原因:Spring Security的CSRF保护拦截

Spring Security默认会开启CSRF(跨站请求伪造)保护,对于POST、PUT这类修改型请求,会要求客户端携带CSRF Token。如果你的请求里没带这个Token,服务端就会触发重定向(通常是跳转到登录页),返回302状态码。

对应的解决方法:

  • 临时关闭CSRF(仅测试环境用):
    如果是开发测试阶段,可以先关闭CSRF保护来验证问题。在你的Spring Security配置类里添加如下代码:
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .csrf().disable() // 关闭CSRF保护
                .authorizeRequests()
                    .antMatchers("/acl").permitAll() // 允许/acl接口匿名访问(如果不需要登录验证的话)
                    .anyRequest().authenticated();
        }
    }
    
  • 客户端携带CSRF Token(生产环境推荐):
    生产环境建议保留CSRF保护,需要客户端先从服务端获取CSRF Token,再在请求头里携带。用Unirest的话可以这么做:
    // 先从Cookie中获取XSRF-TOKEN(登录后服务端会设置这个Cookie)
    CookieStore cookieStore = Unirest.getCookieStore();
    String xsrfToken = null;
    for (Cookie cookie : cookieStore.getCookies()) {
        if ("XSRF-TOKEN".equals(cookie.getName())) {
            xsrfToken = cookie.getValue();
            break;
        }
    }
    
    // 发送POST请求时添加X-XSRF-TOKEN请求头
    HttpResponse<String> asString = Unirest.post(ACL_URL)
        .header("accept", "application/json")
        .header("X-XSRF-TOKEN", xsrfToken)
        .field("aclTitle", title)
        .field("roles", roles)
        .asString();
    

2. 检查会话验证与登录状态

你的Controller里调用了isSessionValid()方法来验证会话,如果这个方法判断会话无效,同时Spring Security配置了未登录请求重定向到登录页,也会返回302。

对应的解决方法:

  • 确保客户端携带有效会话Cookie:
    Unirest默认不会自动保存Cookie,你需要配置Cookie存储,或者手动在请求里添加登录后的JSESSIONID Cookie:
    // 配置Unirest自动保存Cookie
    Unirest.config().cookieStore(new CookieStore());
    // 先发送登录请求,再发送ACL请求,Cookie会自动携带
    
  • 允许接口匿名访问(如果不需要登录):
    如果这个创建ACL的接口不需要用户登录,就在Security配置里把/acl路径设置为允许匿名访问,参考上面的antMatchers("/acl").permitAll()代码。

3. 检查HTTP/HTTPS协议不一致

你看到的重定向地址是https://localhost:8443/acl,如果你的客户端请求的是HTTP协议(比如http://localhost:8080/acl),而服务端配置了强制HTTPS,就会触发302重定向到HTTPS地址。

对应的解决方法:

确保客户端请求的URL和服务端一致,直接使用https://localhost:8443/acl作为请求地址。

验证步骤

建议按照以下顺序排查:

  1. 先把客户端请求URL改成HTTPS,看是否还返回302;
  2. 临时关闭CSRF保护,测试接口是否能正常返回200;
  3. 如果关闭CSRF后正常,再切换到生产环境的CSRF Token携带方案;
  4. 最后检查会话登录状态的问题。

内容的提问来源于stack exchange,提问作者Mohammed Housseyn Taleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:34