首页 文章

如何在Java中使用servlet过滤器来更改传入的servlet请求URL?

提问于
浏览
171

如何使用servlet过滤器来更改传入的servlet请求URL

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

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123


Update :根据BalusC的以下步骤,我想出了以下代码:

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() {
        //
    }
}

web.xml 中的相关条目如下所示:

<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>

我尝试了服务器端和客户端重定向以及预期的结果 . 它起作用了,谢谢BalusC!

3 回答

  • 3

    如果需要更改URL,请不要忘记在代码中添加一个检查,如果没有,则只需调用FilterChain#doFilter(),否则它将在无限循环中调用自身 .

    或者,您也可以使用现有的第三方API为您完成所有工作,例如Tuckey's UrlRewriteFilter,可以像配置Apache的 mod_rewrite 一样进行配置 .

  • 260

    你可以使用准备使用Url Rewrite Filter与这样的规则:

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

    检查Examples以获取更多...示例 .

  • 19

    一个简单的JSF Url Prettyfier过滤器,基于BalusC's answer的步骤 . 过滤器将以/ ui路径开头的所有请求(假设您已将所有xhtml文件存储在那里)转发到同一路径,但添加了xhtml后缀 .

    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 {
    
        }
    
    }
    

相关问题