当前位置: 首页 > 面试题库 >

Spring 5.0.3 RequestRejectedException:由于网址未规范化,因此请求被拒绝

徐高韵
2023-03-14
问题内容

不知道这是Spring 5.0.3的错误还是新功能可以修复我的问题。

升级后,出现此错误。有趣的是,此错误仅在我的本地计算机上。使用HTTPS协议的测试环境中的相同代码可以正常工作。

继续…

我收到此错误的原因是因为我用于加载结果JSP页面的URL是/location/thisPage.jsp。评估代码request.getRequestURI()会给我结果/WEB-INF/somelocation//location/thisPage.jsp。如果我将JSP页面的URL修复为此location/thisPage.jsp,则一切正常。

所以我的问题是,我应该/从JSP代码的路径中删除吗,因为这是今后的要求。或者Spring引入了一个错误,因为我的机器和测试环境之间的唯一区别是协议HTTP与HTTPS。

 org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
    at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:123)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:194)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)

问题答案:

Spring Security Documentation提到了阻塞请求的原因。

例如,它可能包含路径遍历序列(例如/../)或多个正斜杠(//),这也可能导致模式匹配失败。一些容器在执行servlet映射之前将它们标准化,但其他容器则没有。为了避免此类问题,FilterChainProxy使用HttpFirewall策略检查并包装请求。默认情况下,未规范化的请求将自动被拒绝,并且出于匹配目的,将删除路径参数和重复的斜杠。

因此,有两种可能的解决方案-

  1. 删除双斜杠(首选方法)
  2. 通过使用以下代码来自定义StrictHttpFirewall,在Spring Security中允许//。
    步骤1 创建自定义防火墙,以允许在URL中使用斜杠。
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedSlash(true);    
    return firewall;
}

步骤2,然后在Websecurity中配置此bean

@Override
public void configure(WebSecurity web) throws Exception {
    //@formatter:off
    super.configure(web);
    web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
....
}

步骤2是可选步骤,Spring Boot仅需要声明一个类型为bean的bean HttpFirewall



 类似资料:
  • 问题内容: 我为Spring 3 Rest Multipart文件上载了POC。它的工作正常。但是,当我尝试与我的应用程序集成时,我遇到了问题。 它引发以下异常: 如果我在代码的任何部分有误,请告诉我。 Beans: Controller: 问题答案: 问题不在你的代码中,而是在你的请求中。你的多部分请求中缺少边界。正如规范中所说: 多部分实体的Content-Type字段需要一个参数“边界”,该

  • 不确定这是Spring 5.0.3的一个bug,还是我这边的一个修复东西的新特性。 升级后,我得到了这个错误。有趣的是,这个错误只出现在我的本地机器上。使用HTTPS协议的测试环境中的相同代码工作正常。 继续… 我之所以出现此错误,是因为我加载结果JSP页面的URL是。正在评估代码为我提供结果。如果我将JSP页面的URL固定到此,一切正常。 所以我的问题是,我是否应该从代码中的< code>JSP

  • 我在生产中遇到大量错误 据推测,这是由我的url中的引起的,但我不知道它们是从哪里来的。我如何知道是什么url导致了这种情况?当你不知道发生了什么时,很难修复。 我确实意识到有一个相关的问题,但这并没有解决如何诊断有问题的URL。它只解决了如何关闭严格的防火墙。

  • 我正在尝试将一个spring应用程序迁移到spring-boot。在tomcat服务器上运行应用程序时,我收到以下错误: 请求被拒绝,因为URL未规范化。 我已尝试在我的入口点类中添加以下 bean 来解决该错误。 错误日志: 我希望我的jsp页面加载,而不是抛出“白标错误”。

  • 我正在尝试将最近使用Angular2下载的一个文件上传到Spring API Rest。 问题是(在spring应用程序上显示)。。。 请求被拒绝,因为找不到多部分边界 在org。阿帕奇。公猫util。http。文件上传。FileUploadBase$FileItemIteratorImpl。(FileUploadBase.java:831)~[tomcat-embed-core-8.5.28.j

  • 问题内容: 我有一个使用Spring Security的Web应用程序。它使用元素描述不同URL的访问过滤器。默认情况下,这不考虑url的请求参数。我需要根据请求参数设置URL的自定义安全规则。所以我做了以下工作: 1)我创建了一个bean后处理器类,它将为spring安全机制启用request parameters选项: 和代码: 这应该设置弹簧安全性元数据源以考虑请求参数。我已经调试了上面的代