Spring Boot 3(Spring 6)迁移后URL含分号返回200异常求助
Spring Boot 3(Spring 6)URL含分号请求异常丢失问题解决方案
这个问题不少开发者都碰到过,根源是Spring Security 6对RequestRejectedHandler的默认实现做了变更:
- 迁移前默认用的是
DefaultRequestRejectedHandler,它会直接返回400状态码; - 迁移后换成了
ObservationMarkingRequestRejectedHandler,这个处理器默认只负责记录观测指标,不会主动抛出异常或设置响应状态,所以导致本该被拦截的请求返回了200。
解决办法有两种:
1. 自定义处理器,兼顾观测与响应状态
继承ObservationMarkingRequestRejectedHandler,重写handle方法,在完成观测标记后,调用原DefaultRequestRejectedHandler的逻辑返回400:
import org.springframework.security.web.firewall.DefaultRequestRejectedHandler; import org.springframework.security.web.firewall.ObservationMarkingRequestRejectedHandler; import org.springframework.security.web.firewall.RequestRejectedHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SecurityConfig { @Bean public RequestRejectedHandler requestRejectedHandler() { DefaultRequestRejectedHandler defaultHandler = new DefaultRequestRejectedHandler(); return new ObservationMarkingRequestRejectedHandler() { @Override public void handle(HttpServletRequest request, HttpServletResponse response, RequestRejectedException exception) throws IOException, ServletException { super.handle(request, response, exception); defaultHandler.handle(request, response, exception); } }; } }
2. 直接换回默认的DefaultRequestRejectedHandler
如果不需要观测指标,也可以直接注册原处理器:
@Configuration public class SecurityConfig { @Bean public RequestRejectedHandler requestRejectedHandler() { return new DefaultRequestRejectedHandler(); } }
这样配置后,URL中包含分号等被StrictHttpFirewall拦截的请求就会正确返回400状态码了。
内容的提问来源于stack exchange,提问作者Tomas Lukac
相关产品推荐
相关产品推荐

