Spring Authorization Server无效重定向URI异常处理问题排查
核心原因
OAuth2授权端点的内置异常拦截逻辑
Spring Authorization Server针对/authorize端点的OAuth2专属异常(比如InvalidRedirectUriException)有默认处理机制:为适配浏览器端的授权交互场景,框架会优先触发重定向到错误页面,而非直接返回错误状态码。这种内置逻辑会覆盖你在CustomErrorResponseHandler中调用的response.sendError(500),导致自定义错误响应被忽略。响应已被提前提交
当Authorization Server的内置异常处理器触发重定向后,HTTP响应已被标记为"提交完成"状态。根据Servlet规范,此时再调用response.sendError()会被直接忽略,无法修改已提交的响应内容。重定向请求丢失错误上下文
重定向到/error是一个全新的HTTP请求,默认情况下Spring不会将原请求的错误状态码、异常信息等上下文传递到新请求中,因此你的CustomErrorController无法获取到原错误的状态码和详情。
解决思路
1. 自定义OAuth2授权失败处理器
绕过通用的错误响应处理器,针对OAuth2授权流程的异常做专属处理:
- 实现
AuthenticationFailureHandler,专门捕获InvalidRedirectUriException这类授权失败异常; - 在授权服务器配置中,将自定义处理器绑定到
/authorize端点:
@Bean public OAuth2AuthorizationEndpointConfigurer authorizationEndpointConfigurer() { return new OAuth2AuthorizationEndpointConfigurer() .failureHandler(customAuthenticationFailureHandler()); }
在自定义处理器中,你可以直接返回带有警告信息的页面,或者将错误信息存入会话后重定向到自定义警告页,避免框架默认的重定向行为。
2. 手动传递错误上下文到错误页面
如果坚持使用/error端点展示警告,需在重定向时主动保存错误信息:
- 在自定义异常处理逻辑中,将错误状态码和详情存入
HttpSession:
request.getSession().setAttribute("errorCode", HttpStatus.BAD_REQUEST.value()); request.getSession().setAttribute("errorMessage", "无效的重定向URI"); response.sendRedirect("/error");
- 然后在
CustomErrorController中从会话中读取这些信息,而非依赖默认的错误属性。
3. 禁用默认错误重定向(谨慎使用)
通过Spring Boot配置server.error.forward-to-error-page=false,让框架直接返回错误状态码而非重定向。但这种方式可能破坏OAuth2授权流程的浏览器交互逻辑,需根据场景评估是否适用。
内容的提问来源于stack exchange,提问作者Axo

