Custom error page - get originally requested URL

http-status-code-404, jsf, servlets

Solution

The `<error-page>` is under the covers served by a `RequestDispatcher#forward()` call. All details of the original request are available as request attribues which are keyed by the keys as identified by `RequestDispatcher#ERROR_XXX` constants:

- `ERROR_EXCEPTION`: `"jakarta.servlet.error.exception"`

- `ERROR_EXCEPTION_TYPE`: `"jakarta.servlet.error.exception_type"`

- `ERROR_MESSAGE`: `"jakarta.servlet.error.message"`

- `ERROR_REQUEST_URI`: `"jakarta.servlet.error.request_uri"`

- `ERROR_SERVLET_NAME`: `"jakarta.servlet.error.servlet_name"`

- `ERROR_STATUS_CODE`: `"jakarta.servlet.error.status_code"`

(note: if you're still not on Jakarta EE 9 or newer, use `javax.*` instead of `jakarta.*`)

All request attributes are in EL available via the implicit EL object `#{requestScope}`.

So, all with all, this should do in the view:

<p>Unfortunately, the page you requested, #{requestScope['jakarta.servlet.error.request_uri']} does not exist</p>

And equivalently, this should do in the bean, if necessary:

String errorRequestURI = externalContext.getRequestMap().get(RequestDispatcher.ERROR_REQUEST_URI);

Problem

Problem This is a follow-up to yesterday's (unanswered) question (see here) as I try to find an alternative approach. I added the basic ``` <error-page> <error-code>404</error-code> <location>/404search.jsf</location> </error-page> ``` ..to my `web.xml`. I now need to get the URL the user entered to submit to my search function, but I only manage to get the current URL (in this case, ...`404search.jsf`) instead of the actual query the user entered. Attempts - `HttpServletRequest.getRequestURL` returns `http://www.website.com/foldername/404search.jsf` - `HttpServletRequest.getRequestURI` returns `/foldername/404search.jsf` - `HttpServletRequest.getQueryString` returns nothing at all I want it to return `/foldername/wrong-url-the-user-entered#anchor-if-there-is-any` Details... The idea is to get the URL the user entered (such as `www.site.com/product/99999-product-that-cant-be-found` or `www.site.com/faq/support-question-that-doesnt-exist`), REGEX it to remove the hyphens and run a search query with `99999 product that cant be found` or `support question that doesnt exist`. Any suggestions?

Original source

Related problems