10
votes

I've got a Spring MVC app served in Tomcat. When the user enters a page that isn't found, it displays my default 404 page, as set in web.xml

<error-page>
   <error-code>404</error-code>
   <location>/errors/404/</location>
</error-page>

The problem is that if the user goes to http://mydomain/bad/url

it is redirected to http://mydomain/errors/404/

This is annoying, because if a user types in an incorrect URL it's hard to see what the mistake was and correct it.

After a 404 error, I'd like it to keep the original URL, but display the error page. (i.e. a forward, not a redirect). That's my impression of how most web servers work. Is this possible?

1
If your aim is to get the original URL which caused the 404, wont req.getAttribute("javax.servlet.error.request_uri") work for you? - JoseK
Good tip - didn't know about that. But my aim is user-friendliness. I want the URL to remain at the bad value so users can see it, but deliver the error page. - Will Glass
would you answer yourself and close the question? Regards. - Martín Schonaker

1 Answers

4
votes

I don't quite understand why this works the way it does, but...

I've discovered that if you set the status code and have an empty response (or if you try to forward to the error page), Tomcat will redirect to the error page:

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);

But if you ask Tomcat to send the page, it will just forward and leave the URL in the original state, as I'm looking for.

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);
((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND);