且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-04-09 23:37:52

  1. 实现javax.servlet.Filter.
  2. doFilter() 方法,转换传入的 ServletRequestHttpServletRequest.
  3. 使用HttpServletRequest#getRequestURI() 获取路径.
  4. 使用简单的java.lang.String 方法如 substring(), split(), concat() 等提取感兴趣的部分并组成新路径.
  5. 使用 ServletRequest#getRequestDispatcher() 然后 RequestDispatcher#forward() 将请求/响应转发到新的 URL(服务器端重定向,未反映在浏览器地址栏中),转换传入的ServletResponseHttpServletResponse 然后 HttpServletResponse#sendRedirect() 将响应重定向到新的 URL(客户端重定向,反映在浏览器地址栏中).
  6. /*/Check_License/*url-pattern 上的web.xml 中注册过滤器>,取决于上下文路径,或者如果您已经使用 Servlet 3.0,请使用 @WebFilter 注释.
  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.

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

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.

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

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.