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

2022-08-31 06:18:47

如何使用 servlet 过滤器从

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

?


更新:根据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!


答案 1
  1. 实现 javax.servlet.Filter.
  2. doFilter() 方法中,将传入的 ServletRequest 转换为 HttpServletRequest
  3. 使用 HttpServletRequest#getRequestURI() 来获取路径。
  4. 使用简单的java.lang.String方法,如substring()split()concat()等来提取感兴趣的部分并编写新路径。
  5. 使用 ServletRequest#getRequestDispatcher()RequestDispatcher#forward() 将请求/响应转发到新 URL(服务器端重定向,未反映在浏览器地址栏中),或者将传入的 ServletResponse 强制转换为 HttpServletResponse,然后将 HttpServletResponse#sendRedirect() 将响应重定向到新 URL(客户端重定向,反映在浏览器地址栏中)。
  6. 根据上下文路径,在 of 或 上注册过滤器,或者如果您已经在 Servlet 3.0 上注册,请改用 @WebFilter 注释。web.xmlurl-pattern/*/Check_License/*

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

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


答案 2

您可以将现成的 Url 重写过滤器与如下规则结合使用:

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

查看示例以了解更多信息...例子。