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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:25:17