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 );
验证方式
- 调用
/callback端点,检查响应状态码是否为302,且包含正确的Location头 - 查看TRACE日志,确认
FilterChainProxy不再触发内部重定向逻辑
内容的提问来源于stack exchange,提问作者Semyon Kirekov
相关产品推荐
相关产品推荐

