How to use a servlet filter in Java to change an incoming servlet request url? -
how can use servlet filter change incoming servlet request url from
http://nm-java.appspot.com/check_license/dir_my_app/dir_abc/my_obj_123
to
http://nm-java.appspot.com/check_license?contact_id=my_obj_123
?
update: according balusc's steps below, came following code:
public class urlrewritefilter implements filter { @override public void init(filterconfig config) throws servletexception { // } @override public void dofilter(servletrequest req, servletresponse res, filterchain chain) throws servletexception, ioexception { httpservletrequest request = (httpservletrequest) req; string requesturi = request.getrequesturi(); if (requesturi.startswith("/check_license/dir_my_app/")) { string toreplace = requesturi.substring(requesturi.indexof("/dir_my_app"), requesturi.lastindexof("/") + 1); string newuri = requesturi.replace(toreplace, "?contact_id="); req.getrequestdispatcher(newuri).forward(req, res); } else { chain.dofilter(req, res); } } @override public void destroy() { // } }
the relevant entry in web.xml
this:
<filter> <filter-name>urlrewritefilter</filter-name> <filter-class>com.example.urlrewritefilter</filter-class> </filter> <filter-mapping> <filter-name>urlrewritefilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
i tried both server-side , client-side redirect expected results. worked, balusc!
- implement
javax.servlet.filter
. - in
dofilter()
method, cast incomingservletrequest
httpservletrequest
. - use
httpservletrequest#getrequesturi()
grab path. - use straightforward
java.lang.string
methodssubstring()
,split()
,concat()
, on extract part of interest , compose new path. - use either
servletrequest#getrequestdispatcher()
,requestdispatcher#forward()
forward request/response new url (server-side redirect, not reflected in browser address bar), or cast incomingservletresponse
httpservletresponse
,httpservletresponse#sendredirect()
redirect response new url (client side redirect, reflected in browser address bar). - register filter in
web.xml
onurl-pattern
of/*
or/check_license/*
, depending on context path, or if you're on servlet 3.0 already, use@webfilter
annotation instead.
don't forget add check in code if url needs changed , if not, call filterchain#dofilter()
, else call in infinite loop.
alternatively can use existing 3rd party api work you, such tuckey's urlrewritefilter can configured way apache's mod_rewrite
.
Comments
Post a Comment