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

新手上路,请多包涵

如何使用 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


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

原文由 Frank 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 734
2 个回答
  1. 实施 javax.servlet.Filter
  2. doFilter() 方法中,将传入的 ServletRequest 转换为 HttpServletRequest
  3. 使用 HttpServletRequest#getRequestURI() 抓取路径。
  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. 使用 ServletRequest#getRequestDispatcher() 然后 RequestDispatcher#forward() 将请求/响应转发到新的 URL(服务器端重定向,不反映在浏览器地址栏中), 转换传入的 ServletResponseHttpServletResponse 然后 HttpServletResponse#sendRedirect() 将响应重定向到新的 URL(客户端重定向,反映在浏览器地址栏中)。
  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 已经,使用 @WebFilter 注释代替。

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

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

原文由 BalusC 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用现成的 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>

查看 示例 以获取更多…示例。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题