SpringBoot 提示:RequestRejectedException:The request was rejected because the URL was not normalized.

今天遇到一个问题:本地磁盘通过SpringMVC 资源映射成URL地址可以访问的资源,提示如下错误信息:

RequestRejectedException:The request was rejected because the URL was not normalized.

错误的大致意思:请求资源的URL地址不规范错误。

造成错误发生的原因

由于我项目集成SpringSecurity 框架,在此框架中存在一个HttpFirewall接口。主要用于:用于拒绝潜在危险请求。

HttpFirewall继承图

 上述错误报错点在:StrictHttpFirewall.isNormalized()方法,主要用于:检查URL是否包含指定特殊字符./", "/../" or "/."

 异常的抛出

解决办法: 

指定HttpFirewall的默认实现为DefaultHttpFirewall

实列代码:

    /**
	 * HTTP 防火墙规则修改:允许URL包含双斜杠
	 * @return
	 */
	@Bean
	public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
		return new DefaultHttpFirewall();  
	}

 

<think>好的,我现在需要解决用户提到的Spring Security中的RequestRejectedException问题。用户提供的引用信息显示,这个错误通常是因为URL未规范化或被检测到潜在的安全风险。用户已经给出了一些解决方法,比如配置DefaultHttpFirewall,但可能还需要更详细的步骤或解释。 首先,我要确认这个异常的原因。根据引用[1]和[4],当URL未标准化或包含可疑字符时,Spring Security的严格防火墙会拦截请求。例如,双斜杠、路径遍历序列(如../)或特殊字符可能导致这个问题。 接下来,用户提到的解决方案是在启动类中配置DefaultHttpFirewall的Bean。引用[1]和[2]都提到了这一点,所以这应该是有效的。但需要详细说明如何正确配置,可能需要代码示例,并解释为什么这样做有效。 另外,引用[3]提到了SecurityContextHolderAwareRequestFilter,这可能在处理请求包装时相关,但用户的问题更直接与防火墙配置有关,所以可能不需要深入这部分,除非有其他问题。 用户可能需要了解其他可能的解决方案,比如放宽URL检查或自定义防火墙规则。例如,如果对接方无法修改URL,可能需要平台适配,如引用[4]所述。这时候可能需要自定义HttpFirewall来允许某些特定的非规范URL。 需要注意配置DefaultHttpFirewall可能带来的安全风险,比如允许不规范的URL可能增加攻击面。需要提醒用户权衡安全性和需求,并建议其他安全措施。 最后,生成相关问题时要围绕解决方案、替代方法、安全影响和异常的其他原因展开,以帮助用户全面了解问题。</think>### 解决Spring Security中RequestRejectedException错误的方法 当Spring Security检测到URL不规范或包含潜在危险字符时,会抛出`org.springframework.security.web.firewall.RequestRejectedException`。以下是分步解决方案: --- #### 方法1:配置`DefaultHttpFirewall`放宽URL检查 1. **在Spring Boot启动类中定义Bean** 通过替换默认的`StrictHttpFirewall`为更宽松的`DefaultHttpFirewall`,允许部分非规范化URL: ```java @Bean public HttpFirewall defaultHttpFirewall() { return new DefaultHttpFirewall(); } ``` **原理**:`DefaultHttpFirewall`对URL的检查较宽松,可避免因双斜杠(`//`)、路径遍历(如`../`)或特殊字符触发的拦截[^1][^2]。 2. **确保Security配置引用该Bean** 在`SecurityConfig`类中,需显式配置`httpFirewall`: ```java @Autowired private HttpFirewall httpFirewall; @Override protected void configure(HttpSecurity http) throws Exception { http .requestMatcher(request -> httpFirewall.getFirewalledRequest((HttpServletRequest) request)) // 其他安全配置 } ``` --- #### 方法2:自定义`HttpFirewall`规则(精细控制) 若需保留安全检查但调整特定规则,可继承`StrictHttpFirewall`并重写方法: ```java @Bean public HttpFirewall customFirewall() { StrictHttpFirewall firewall = new StrictHttpFirewall(); firewall.setAllowUrlEncodedSlash(true); // 允许URL编码的斜杠(如%2F) firewall.setAllowUrlEncodedPercent(true); // 允许百分号 firewall.setAllowBackSlash(true); // 允许反斜杠 return firewall; } ``` **适用场景**:需兼容历史API或第三方系统非规范URL时[^4]。 --- #### 方法3:检查请求处理链的过滤器配置 若异常由过滤器链中的包装类引发(如`SecurityContextHolderAwareRequestFilter`),可尝试调整过滤器顺序或禁用非必要过滤器: ```java @Override protected void configure(HttpSecurity http) throws Exception { http .addFilterBefore(customRequestFilter(), SecurityContextHolderAwareRequestFilter.class) // 其他配置 } ``` --- #### 安全风险提示 放宽URL检查可能导致路径注入、目录遍历等漏洞。建议: - 仅在生产环境临时使用`DefaultHttpFirewall` - 配合输入验证和输出编码 - 监控日志中的异常请求模式[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值