How to use a servlet filter in Java to change an incoming servlet request url?

后端 未结 3 1221
春和景丽
春和景丽 2020-11-22 07:24

How can I use a servlet filter to change an incoming servlet request url from

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

相关标签:
3条回答
  • 2020-11-22 07:52

    You could use the ready to use Url Rewrite Filter with a rule like this one:

    <rule>
      <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
      <to>/Check_License?Contact_Id=My_Obj_$1</to>
    </rule>
    

    Check the Examples for more... examples.

    0 讨论(0)
  • 2020-11-22 07:59

    A simple JSF Url Prettyfier filter based in the steps of BalusC's answer. The filter forwards all the requests starting with the /ui path (supposing you've got all your xhtml files stored there) to the same path, but adding the xhtml suffix.

    public class UrlPrettyfierFilter implements Filter {
    
        private static final String JSF_VIEW_ROOT_PATH = "/ui";
    
        private static final String JSF_VIEW_SUFFIX = ".xhtml";
    
        @Override
        public void destroy() {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
            String requestURI = httpServletRequest.getRequestURI();
            //Only process the paths starting with /ui, so as other requests get unprocessed. 
            //You can register the filter itself for /ui/* only, too
            if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                    && !requestURI.contains(JSF_VIEW_SUFFIX)) {
                request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                    .forward(request,response);
            } else {
                chain.doFilter(httpServletRequest, response);
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 08:15
    1. Implement javax.servlet.Filter.
    2. In doFilter() method, cast the incoming ServletRequest to HttpServletRequest.
    3. Use HttpServletRequest#getRequestURI() to grab the path.
    4. Use straightforward java.lang.String methods like substring(), split(), concat() and so on to extract the part of interest and compose the new path.
    5. Use either ServletRequest#getRequestDispatcher() and then RequestDispatcher#forward() to forward the request/response to the new URL (server-side redirect, not reflected in browser address bar), or cast the incoming ServletResponse to HttpServletResponse and then HttpServletResponse#sendRedirect() to redirect the response to the new URL (client side redirect, reflected in browser address bar).
    6. Register the filter in web.xml on an url-pattern of /* or /Check_License/*, depending on the context path, or if you're on Servlet 3.0 already, use the @WebFilter annotation for that instead.

    Don't forget to add a check in the code if the URL needs to be changed and if not, then just call FilterChain#doFilter(), else it will call itself in an infinite loop.

    Alternatively you can also just use an existing 3rd party API to do all the work for you, such as Tuckey's UrlRewriteFilter which can be configured the way as you would do with Apache's mod_rewrite.

    0 讨论(0)
提交回复
热议问题