当前位置: 首页 > 知识库问答 >
问题:

spring 5 . 0 . 3 RequestRejectedException:请求被拒绝,因为URL没有被规范化

潘宪
2023-03-14

不确定这是Spring 5.0.3的一个bug,还是我这边的一个修复东西的新特性。

升级后,我得到了这个错误。有趣的是,这个错误只出现在我的本地机器上。使用HTTPS协议的测试环境中的相同代码工作正常。

继续…

我之所以出现此错误,是因为我加载结果JSP页面的URL是/location/thisPage.JSP。正在评估代码请求。getRequestURI()为我提供结果/WEB-INF/somelocation//location/thisPage.jsp。如果我将JSP页面的URL固定到此location/thisPage。jsp,一切正常。

所以我的问题是,我是否应该从代码中的< code>JSP路径中删除< code>/,因为这是前进所需要的。或者< code>Spring引入了一个错误,因为我的机器和测试环境之间的唯一区别是协议< code>HTTP和< code>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)

共有3个答案

白永昌
2023-03-14

我遇到了同样的问题:

Spring Boot版本=1.5.10
Spring Security版本=4.2.4


问题发生在endpoint上,其中ModelAndViewviewName是用前面的正斜杠定义的。例子:

ModelAndView mav = new ModelAndView("/your-view-here");

如果我去掉斜线,效果会很好。示例:

ModelAndView mav = new ModelAndView("your-view-here");

我还用RedirectView做了一些测试,它似乎可以在前面加一个正斜杠。

吉和同
2023-03-14

set允许网址编码斜杠(true)对我不起作用。仍然有内部方法在具有双斜杠时是正则化返回的。

我通过仅具有以下代码将“严格http防火墙”替换为“默认http防火墙”:

@Bean
public HttpFirewall defaultHttpFirewall() {
    return new DefaultHttpFirewall();
}

对我来说效果不错。< br >使用< code>DefaultHttpFirewall有什么风险吗?

怀晋
2023-03-14

Spring Security文档在请求中提到了阻塞//的原因。

例如,它可能包含路径遍历序列(如/../)或多个正斜杠(//),这也可能导致模式匹配失败。一些容器在执行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启动只需要一个Bean声明为HttpFirewall类型,它将在过滤器链中自动配置它。

Spring Security 5.4更新

在Spring Security 5.4及更高版本(Spring Boot

import org.springframework.security.web.firewall.RequestRejectedHandler;
import org.springframework.security.web.firewall.HttpStatusRequestRejectedHandler;

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

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

  • 我正在开发一个文件上传功能。为此,我有一个spring boot web服务和客户机。 WebService:- 如果我删除文件并给出一个字符串,那么调用将继续进行。可能是什么问题。

  • 问题内容: 不知道这是Spring 5.0.3的错误还是新功能可以修复我的问题。 升级后,出现此错误。有趣的是,此错误仅在我的本地计算机上。使用HTTPS协议的测试环境中的相同代码可以正常工作。 继续… 我收到此错误的原因是因为我用于加载结果JSP页面的URL是。评估代码会给我结果。如果我将JSP页面的URL修复为此,则一切正常。 所以我的问题是,我应该/从JSP代码的路径中删除吗,因为这是今后的

  • 问题内容: 我在端口5000的node.js服务器上设置了CORS,如下所示: 我现在正尝试像这样在从硬盘打开的静态网页中使用JQuery发送AJAX POST请求: 该函数从不调用,并且我得到的唯一警报是来自XHR 处理程序的警报,其中包含以下错误: 我认为CORS配置合理, 我缺少什么? 编辑 :对于我而言,我能找到的最佳解决方案是从服务器发送页面: 问题答案: 这是我正在使用的代码。它位于我

  • 我正在用Spring rest上传文件 我正在尝试发送内容类型为multipart/form data或multipart/form data的请求 然而,我一直得到一个错误:请求被拒绝,因为没有找到多部分边界 我不确定这是rest中的问题还是我的请求被打乱了。我正在使用restclient,将内容类型设置为多部分/表单数据,并从restclient发送文件 错误: 这是我的代码 网状物xml d