我们从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"
我已经搜索了Apache 7 changelog和安全修复程序,以查看是否有任何可能导致这种情况发生的事情,但找不到任何东西。我已经尝试过调整useRelativeRedirects Context属性,但是它似乎没有任何作用。在调试过程中,将我的头发拉出来,逐步通过过滤器链。任何帮助将非常感激!
我找出问题所在,找到了解决方案。
问题在于此提交更改了org.apache.catalina.core.ApplicationContext.getRequestDispatcher
7.0.78和7.0.79之间的行为。以前,提供的URL在附加到上下文路径之前已被规范化。在7.0.79及更高版本中,不再使用标准化版本。
没有设置可以更改此行为,但是我想出了如何通过修改Struts传入的位置来解决问题的方法。当请求到达ApplicationContext时,Struts已经将上下文和url合并到一个位置,但是我们可以覆盖Request批注中的上下文部分。它"WEB-INF/content/" + "%{url}"
用于其他所有内容,因此我将其更改为just "%{url}"
。
之前,结果为“ WEB-INF / content /../../ bar.jsp”
@Result(name = "foo", location = "../../bar.jsp")
之后,结果为“ bar.jsp”
@Result(name = "foo", location = "bar.jsp", params = {"location", "%{url}"})