Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tomcat is not adding trailing slash to web app's context

I'd like to have Tomcat automatically add a trailing slash to my app's context if the url is entered without it.

When I test with Jetty, it automatically adds the trailing slash to my app's context, but Tomcat doesn't do this.

I'm uncertain what the context will be named once deployed, as I'm handing the WAR off to someone else, so any resource references in HTML is all relative. Is there any way to have Tomcat automatically redirect to the same context with a trailing slash added?

Currently Using Tomcat 7 with Spring 3.

like image 624
Badweather Avatar asked Jun 15 '12 17:06

Badweather


3 Answers

It's an old post, but as of Tomcat 7.0.67, you need to add the following attribute to your context.xml file:

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

As per the 7.0.67 changelog:

Move the functionality that provides redirects for context roots and directories where a trailing / is added from the Mapper to the DefaultServlet. This enables such requests to be processed by any configured Valves and Filters before the redirect is made. This behaviour is configurable via the mapperContextRootRedirectEnabled and mapperDirectoryRedirectEnabled attributes of the Context which may be used to restore the previous behaviour.

And in the Tomcat context documentation:

mapperContextRootRedirectEnabled: If enabled, requests for a web application context root will be redirected (adding a trailing slash) if necessary by the Mapper rather than the default Servlet. This is more efficient but has the side effect of confirming that the context path exists. If not specified, the default value of false is used.

like image 127
Pat Avatar answered Oct 21 '22 09:10

Pat


It seems that your application's web.xml has a mapping to "/*". A servlet-mapping to "/*" causes tomcat to pass the request as-is to the web application (i.e. does not redirect).

To properly redirect, you must change the "/*" mapping to just "/", the latter means the default servlet.

like image 43
alexgirao Avatar answered Oct 21 '22 09:10

alexgirao


Tomcat adds a trailing slash automatically. Just test it with the example application supplied with Tomcat..

If - due to some special configuration - it does not, I'd write a Filter that examines the query string and redirects as needed by the application. Many times this is needed anyways (doing http->https redirections, etc.)

like image 21
Istvan Devai Avatar answered Oct 21 '22 11:10

Istvan Devai