Tomcat没有向Web应用程序的上下文添加尾部斜杠

时间:2012-06-15 17:38:24

标签: java spring tomcat war

如果在没有它的情况下输入网址,我想让Tomcat自动为我的应用程序的上下文添加一个斜杠。

当我使用Jetty进行测试时,它会自动将尾部斜杠添加到我的应用程序的上下文中,但Tomcat不会这样做。

我不确定在部署之后将命名的上下文是什么,因为我将WAR交给其他人,因此HTML中的任何资源引用都是相对的。有没有办法让Tomcat自动重定向到添加了尾部斜杠的相同上下文?

目前在Spring 3中使用Tomcat 7。

5 个答案:

答案 0 :(得分:28)

这是一篇旧帖子,但从Tomcat 7.0.67开始,您需要将以下属性添加到context.xml文件中:

<Context mapperContextRootRedirectEnabled="true">...</Context>

根据7.0.67 changelog

  

移动为上传/从Mapper添加到DefaultServlet的上下文和目录提供重定向的功能。这样,在重定向之前,任何已配置的阀门和过滤器都可以处理此类请求。此行为可通过Context的mapperContextRootRedirectEnabled和mapperDirectoryRedirectEnabled属性进行配置,该属性可用于恢复先前的行为。

在Tomcat上下文中documentation

  

mapperContextRootRedirectEnabled:如果启用,将在必要时由Mapper而不是默认Servlet重定向(添加尾部斜杠)对Web应用程序上下文根的请求。这更有效,但具有确认上下文路径存在的副作用。如果未指定,则使用默认值false。

答案 1 :(得分:6)

您的应用程序的web.xml似乎已映射到"/*"。 servlet映射到"/*"会导致tomcat按原样将请求传递给Web应用程序(即不重定向)。

要正确重定向,必须将"/*"映射更改为"/",后者表示默认servlet。

答案 2 :(得分:5)

Tomcat会自动添加尾部斜杠。只需使用Tomcat提供的示例应用程序对其进行测试..

如果 - 由于某些特殊配置 - 它没有,我会编写一个过滤器来检查查询字符串并根据应用程序的需要重定向。很多时候这是必要的(做http-&gt; https重定向等)

答案 3 :(得分:0)

您是否尝试过在Tomcat上使用URL Rewrite? 这可能会有所帮助:http://code.google.com/p/urlrewritefilter/

如果这没有用,请看一下:URL rewrite in tomcat web.xml

答案 4 :(得分:0)

Pat的优秀答案帮助我挖掘了更多细节。这似乎与某些版本的Tomcat(Tomcat 7在7.0.67+,Tomcat 8在8.29和8.37之间)的某些怪癖有关,这些怪癖与会话cookie和URL重定向有关。

底线似乎是,如果java服务器在末尾创建带斜杠的路径特定会话cookie(例如&#34; / app_name /&#34;),那么服务器也必须执行自动初始化重定向(/ app_name - &gt; / app_name /)...否则,会话cookie将不会随请求一起发送,并且它永远不会像服务器那样查看有效会话。这可能会导致从应用程序到身份验证的重定向循环。

Tomcat中有一些配置可以控制这两种行为,但据我所知,它们在这些版本中实际上是不同步的,因此可能会使用来获取cookie 斜线,没有获取重定向。 Tomcat更改日志中存在若干相关问题/更改: https://tomcat.apache.org/tomcat-8.0-doc/changelog.html

正如Pat已经指出的那样,通过将此属性添加到应用程序的Context元素来解决此问题:

<Context mapperContextRootRedirectEnabled="true">