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

Spring Boot 3:如何禁用内部重定向,直接返回302状态码?

Spring Boot 3升级后/callback端点302被内部重定向的解决方案

问题核心

升级到Spring Boot 3后,供外部服务调用的/callback端点原本应返回302状态码+Location跳转地址,但实际被Spring的FilterChainProxy捕获响应并触发内部重定向,直接返回跳转目标端点的结果,完全不符合外部调用的预期。

已尝试无效方案

  • 代码实现调整:从HttpServletResponse.sendRedirect()改为返回带Location头的ResponseEntity<HttpHeaders>
  • 配置TestRestTemplate仅启用Cookie支持(未禁用重定向跟随)
  • 升级springdoc依赖至2.x版本

可行解决方案

1. Spring Security配置禁用内部重定向处理

问题根源大概率是Spring Security的过滤器链(FilterChainProxy)对302响应做了内部转发处理,需要针对/callback端点单独配置,阻止这种行为:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/callback").permitAll()
                // 其他接口的授权规则按需补充
            )
            // 针对/callback端点,直接返回302状态码,不触发内部重定向
            .exceptionHandling(exceptions -> exceptions
                .defaultAuthenticationEntryPointFor(
                    new HttpStatusEntryPoint(HttpStatus.FOUND),
                    request -> "/callback".equals(request.getRequestURI())
                )
            )
            // 添加自定义过滤器,确保响应直接返回302,不进入后续转发逻辑
            .addFilterBefore(new CallbackRedirectFilter(), FilterChainProxy.class);

        return http.build();
    }

    static class CallbackRedirectFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            if ("/callback".equals(request.getRequestURI())) {
                filterChain.doFilter(request, response);
                // 确认响应为302时直接结束请求
                if (response.getStatus() == HttpStatus.FOUND.value()) {
                    return;
                }
            }
            filterChain.doFilter(request, response);
        }
    }
}

2. 关闭OAuth2客户端自动重定向处理(若适用)

如果/callback是OAuth2授权回调端点,Spring Boot 3升级后可能默认启用了内部重定向优化,可通过配置关闭:

# 替换[client-id]为你的OAuth2客户端ID
spring.security.oauth2.client.registration.[client-id].redirect-uri-mode=APPEND

3. 修正TestRestTemplate测试配置

测试时必须明确禁用重定向跟随,才能正确捕获302响应:

testRestTemplate = new TestRestTemplate(
    restTemplateBuilder, null, null,
    TestRestTemplate.HttpClientOption.ENABLE_COOKIES,
    TestRestTemplate.HttpClientOption.DISABLE_REDIRECTS
);

验证方式

  1. 调用/callback端点,检查响应状态码是否为302,且包含正确的Location头
  2. 查看TRACE日志,确认FilterChainProxy不再触发内部重定向逻辑

内容的提问来源于stack exchange,提问作者Semyon Kirekov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:10:13