Spring Boot中RequestRejectedException异常:如何配置Spring Security解决?
Spring Boot应用RequestRejectedException错误解决
问题描述
我的Spring Boot应用抛出如下错误:
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the header value "Mozilla/5.0 (Windows NT 10.0; ГўВЂВ¦) Gecko/20100101 Firefox/73.0" is not allowed. at org.springframework.security.web.firewall.StrictHttpFirewall$StrictFirewalledRequest.validateAllowedHeaderValue(StrictHttpFirewall.java:833) ~[spring-security-web-6.0.3.jar!/:6.0.3] at org.springframework.security.web.firewall.StrictHttpFirewall$StrictFirewalledRequest.getHeader(StrictHttpFirewall.java:716) ~[spring-security-web-6.0.3.jar!/:6.0.3] at jakarta.servlet.http.HttpServletRequestWrapper.getHeader(HttpServletRequestWrapper.java:82) ~[tomcat-embed-core-10.1.8.jar!/:na] at jakarta.servlet.http.HttpServletRequestWrapper.getHeader(HttpServletRequestWrapper.java:82) ~[tomcat-embed-core-10.1.8.jar!/:na] at jakarta.servlet.http.HttpServletRequestWrapper.getHeader(HttpServletRequestWrapper.java:82) ~[tomcat-embed-core-10.1.8.jar!/:na] at jakarta.servlet.http.HttpServletRequestWrapper.getHeader(HttpServletRequestWrapper.java:82) ~[tomcat-embed-core-10.1.8.jar!/:na]
该错误由Spring Security的StrictHttpFirewall组件触发,默认规则拒绝了包含特殊编码字符的请求头(如示例中的User-Agent头)。
解决方法
通过自定义StrictHttpFirewall的规则,放宽对请求头的限制:
- 创建Spring Security配置类,覆盖默认的HttpFirewall实例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.web.firewall.HttpFirewall; import org.springframework.security.web.firewall.StrictHttpFirewall; @Configuration public class SecurityConfig { @Bean public HttpFirewall allowSpecialCharactersHttpFirewall() { StrictHttpFirewall firewall = new StrictHttpFirewall(); // 允许所有请求头值(可根据实际需求替换为更严格的校验逻辑) firewall.setAllowedHeaderValues(header -> true); // 若有需要,还可放宽URL编码字符限制(示例) // firewall.setAllowedUrlEncodedCharacters(StandardCharsets.UTF_8.displayName()); return firewall; } }
- 若需更精细的安全控制,避免完全放行所有请求头,可自定义正则表达式校验合法内容,例如针对User-Agent头的常见字符:
// 允许包含字母、数字及常见符号的请求头值 firewall.setAllowedHeaderValues(header -> header.matches("^[a-zA-Z0-9()\\[\\]/.,;\\s:=-]+$") );
- 注意事项:放宽防火墙规则会降低应用的安全防护等级,建议仅针对业务必需的请求头或字符放行,避免引入潜在安全风险。
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

