如果在没有它的情况下输入了 url,我想让 Tomcat 自动在我的应用程序的上下文中添加一个斜杠。
当我使用 Jetty 进行测试时,它会自动将斜杠添加到我的应用程序的上下文中,但 Tomcat 不会这样做。
我不确定一旦部署上下文将被命名,因为我将 WAR 交给其他人,所以 HTML 中的任何资源引用都是相对的。有没有办法让 Tomcat 自动重定向到相同的上下文并添加斜杠?
目前使用 Tomcat 7 和 Spring 3。
这是一篇旧文章,但从 Tomcat 7.0.67 开始,您需要将以下属性添加到您的 context.xml 文件中:
<Context mapperContextRootRedirectEnabled="true">...</Context>
根据 7.0.67 变更日志:
将为上下文根和目录提供重定向的功能从 Mapper 中添加尾随 / 移动到 DefaultServlet。这使得此类请求能够在进行重定向之前由任何已配置的 Valve 和 Filters 处理。此行为可通过 Context 的 mapperContextRootRedirectEnabled 和 mapperDirectoryRedirectEnabled 属性进行配置,这些属性可用于恢复先前的行为。
在 Tomcat 上下文文档中:
mapperContextRootRedirectEnabled:如果启用,对 Web 应用程序上下文根的请求将在必要时由 Mapper 而不是默认的 Servlet 重定向(添加尾部斜杠)。这更有效,但具有确认上下文路径存在的副作用。如果未指定,则使用默认值 false。
您的应用程序的 web.xml 似乎有一个映射到"/*"
. servlet-mapping to"/*"
使tomcat 将请求按原样传递给Web 应用程序(即不重定向)。
要正确重定向,您必须将"/*"
映射更改为 just "/"
,后者表示默认 servlet。
Tomcat 会自动添加一个斜杠。只需使用 Tomcat 提供的示例应用程序对其进行测试。
如果 - 由于某些特殊配置 - 它没有,我会编写一个过滤器来检查查询字符串并根据应用程序的需要进行重定向。很多时候这是无论如何都需要的(进行 http->https 重定向等)
你试过在 Tomcat 上玩 URL Rewrite 吗?
这可能会有所帮助:http ://code.google.com/p/urlrewritefilter/
如果这没有帮助,请查看:URL rewrite in tomcat web.xml
Pat 的出色回答帮助我挖掘了更多细节。这似乎与某些版本的 Tomcat(7.0.67+ 的 Tomcat 7,以及 8.29 和 8.37 之间的 Tomcat 8)中的一些怪癖有关,与会话 cookie 和 URL 重定向有关。
底线似乎是,如果 java 服务器创建路径特定的会话 cookie,末尾带有斜杠(如“/app_name/”),那么服务器还必须执行自动初始重定向(/app_name --> /app_name /) ... 否则,会话 cookie 将不会随请求一起发送,并且它永远不会像您拥有有效会话一样查看服务器。这可能会导致从应用程序到身份验证的重定向循环。
Tomcat 中有一些配置可以控制这两种行为,但据我所知,它们在这些版本中基本上是不同步的,因此人们可能会获得带有斜杠的 cookie,而不会获得重定向。Tomcat 更改日志中有几个相关的问题/更改: https ://tomcat.apache.org/tomcat-8.0-doc/changelog.html
正如 Pat 已经指出的那样,可以通过将此属性添加到应用程序的 Context 元素来解决此问题:
<Context mapperContextRootRedirectEnabled="true">