如何使用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 回答
实施javax.servlet.Filter .
在doFilter()方法中,将传入的ServletRequest强制转换为HttpServletRequest .
使用HttpServletRequest#getRequestURI()抓取路径 .
使用简单的java.lang.String方法,如substring(),split(),concat()等,以提取感兴趣的部分并组成新路径 .
使用ServletRequest#getRequestDispatcher()然后RequestDispatcher#forward()将请求/响应转发到新URL(服务器端重定向,未反映在浏览器地址栏中), or 将传入ServletResponse转换为HttpServletResponse然后HttpServletResponse#sendRedirect()将响应重定向到新URL(客户端重定向,反映在浏览器地址栏中) .
在
web.xml
/*
或/Check_License/*
上注册web.xml
中的过滤器,具体取决于上下文路径,或者如果您已经在Servlet 3.0上,请使用@WebFilter注释 .如果需要更改URL,请不要忘记在代码中添加一个检查,如果没有,则只需调用FilterChain#doFilter(),否则它将在无限循环中调用自身 .
或者,您也可以使用现有的第三方API为您完成所有工作,例如Tuckey's UrlRewriteFilter,可以像配置Apache的
mod_rewrite
一样进行配置 .你可以使用准备使用Url Rewrite Filter与这样的规则:
检查Examples以获取更多...示例 .
一个简单的JSF Url Prettyfier过滤器,基于BalusC's answer的步骤 . 过滤器将以/ ui路径开头的所有请求(假设您已将所有xhtml文件存储在那里)转发到同一路径,但添加了xhtml后缀 .