Fra*_*ank 179 java url servlets request servlet-filters
如何使用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() {
//
}
}
Run Code Online (Sandbox Code Playgroud)
相关条目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>
Run Code Online (Sandbox Code Playgroud)
我尝试了服务器端和客户端重定向以及预期的结果.它起作用了,谢谢BalusC!
Bal*_*usC 272
javax.servlet.Filter
.doFilter()
方法中,将传入转换ServletRequest
为HttpServletRequest
.HttpServletRequest#getRequestURI()
抢的路径.java.lang.String
方法,如substring()
,split()
,concat()
等提取感兴趣的部分,构成了新的路径.ServletRequest#getRequestDispatcher()
,然后RequestDispatcher#forward()
转发该请求/响应新的URL(服务器端重定向,而不是在浏览器地址栏中反射),或投传入ServletResponse
到HttpServletResponse
,然后HttpServletResponse#sendRedirect()
重定向到新的URL的响应(客户端重定向,反映在浏览器地址栏).web.xml
上url-pattern
的/*
或/Check_License/*
根据上下文路径上,或者如果你是在Servlet的3.0已经使用了@WebFilter
注解为代替.如果需要更改URL,请不要忘记在代码中添加一个检查,如果没有,则只需调用FilterChain#doFilter()
,否则它将在无限循环中调用自身.
或者,您也可以使用现有的第三方API为您完成所有工作,例如Tuckey的UrlRewriteFilter,它可以像配置Apache一样进行配置mod_rewrite
.
Pas*_*ent 21
您可以使用准备使用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>
Run Code Online (Sandbox Code Playgroud)
查看示例以获取更多...示例.
一个简单的基于BalusC回答步骤的JSF Url Prettyfier过滤器。过滤器将所有从/ ui路径开始的请求(假设您已经存储了所有xhtml文件)转发到同一路径,但是添加了xhtml后缀。
public class UrlPrettyfierFilter implements Filter {
private static final String JSF_VIEW_ROOT_PATH = "/ui";
private static final String JSF_VIEW_SUFFIX = ".xhtml";
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
String requestURI = httpServletRequest.getRequestURI();
//Only process the paths starting with /ui, so as other requests get unprocessed.
//You can register the filter itself for /ui/* only, too
if (requestURI.startsWith(JSF_VIEW_ROOT_PATH)
&& !requestURI.contains(JSF_VIEW_SUFFIX)) {
request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
.forward(request,response);
} else {
chain.doFilter(httpServletRequest, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
210794 次 |
最近记录: |