Reputation: 336
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 allI 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?
Upvotes: 6
Views: 1804
Reputation: 1108632
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);
Upvotes: 15
Reputation: 202
You might be able to get that URL with the "referer" (misspelled) request header.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36
Java usage: HttpServletRequest - how to obtain the referring URL?
Upvotes: -1