Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Struts相对路径在7.0.78中变平,但在7.0.79中没有变平,断开是标准化的_Java_Spring_Tomcat_Struts2_Tomcat7 - Fatal编程技术网

Java Struts相对路径在7.0.78中变平,但在7.0.79中没有变平,断开是标准化的

Java Struts相对路径在7.0.78中变平,但在7.0.79中没有变平,断开是标准化的,java,spring,tomcat,struts2,tomcat7,Java,Spring,Tomcat,Struts2,Tomcat7,我们将从Spring Boot应用程序中的Struts 2操作返回一个@Result,该操作指定一个包含相对路径的位置,以便将同级目录中的jsp引用到应用程序其余部分的根目录 @Result(name = "foo", location = "../../cat/bar.jsp") 这在Tomcat 7.0.78中起作用,在StrictHttpFirewall.getFirewalledRequest中作为: ApplicationHttpRequest.requestURI = "rootP

我们将从Spring Boot应用程序中的Struts 2操作返回一个@Result,该操作指定一个包含相对路径的位置,以便将同级目录中的jsp引用到应用程序其余部分的根目录

@Result(name = "foo", location = "../../cat/bar.jsp")
这在Tomcat 7.0.78中起作用,在StrictHttpFirewall.getFirewalledRequest中作为:

ApplicationHttpRequest.requestURI = "rootParent/cat/bar.jsp"
在Tomcat 7.0.79+中,这种扁平化不再发生,当请求到达StrictHttpFirewall以检查url规范化时,它会爆炸,因为它以以下方式到达:

ApplicationHttpRequest.requestURI = "rootParent/root/WEB-INF/../../cat/bar.jsp"

我已经搜索了Apache7,看看是否有任何东西可能导致这种情况发生,但什么也找不到。我尝试过调整userelativedirects上下文属性,但似乎没有任何效果。在调试中通过过滤器链拉出头发。任何帮助都将不胜感激

所有这些相对路径经常出现在安全漏洞工具中,因此它们通常不是一个好主意,您可能应该停止使用它们

也就是说,如果你像骡子一样固执,你仍然可以使用它们,只是不能在注释本身中使用,但是你可以使用
static
变量来实现同样的目标,如果这些文件作为资源存在于某处:


FooBar.class.getClassLoader().getResource('../../cat/bar.jsp')
我找到了问题并找到了解决方案

问题是,
org.apache.catalina.core.ApplicationContext.getRequestDispatcher
的行为在7.0.78和7.0.79之间发生了变化。以前,所提供的URL在附加到上下文路径之前是标准化的。在7.0.79及更高版本中,不再使用规范化版本

没有改变这种行为的设置,但是我通过修改Struts传入的位置来解决这个问题。当请求到达ApplicationContext时,struts已经将上下文和url组合到一个位置,但是我们可以覆盖请求注释中的上下文部分。它使用
“WEB-INF/content/”+“%{url}”
处理其他所有内容,因此我将它改为只使用
“%{url}”

之前,结果为“WEB-INF/content/../../bar.jsp”

之后,结果为“bar.jsp”

@Result(name = "foo", location = "../../bar.jsp")
@Result(name = "foo", location = "bar.jsp", params = {"location", "%{url}"})