如何使用 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 许可协议
javax.servlet.Filter
。doFilter()
方法中,将传入的ServletRequest
转换为HttpServletRequest
。HttpServletRequest#getRequestURI()
抓取路径。java.lang.String
methods likesubstring()
,split()
,concat()
and so on to extract the part of interest and compose the new path.ServletRequest#getRequestDispatcher()
然后RequestDispatcher#forward()
将请求/响应转发到新的 URL(服务器端重定向,不反映在浏览器地址栏中), 或 转换传入的ServletResponse
到HttpServletResponse
然后HttpServletResponse#sendRedirect()
将响应重定向到新的 URL(客户端重定向,反映在浏览器地址栏中)。web.xml
on anurl-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
一样进行配置。