【发布时间】:2018-07-31 02:35:40
【问题描述】:
如何使用 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!
【问题讨论】:
-
您使用的是哪个版本的 servlet 规范?转发请求的方式会随着版本的不同而变化。
-
See this post 它还有一个过滤器可以满足您的需求
-
请注意,如果您的原始 URL 包含参数,即nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123?**param1=A¶m2=B** 那么这些参数也会被转发到下一个 servlet/jsp。我没有找到摆脱或替换原始参数的方法(仅通过使用 HttpServletRequestWrapper)。有什么想法吗?...更新:http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ 似乎解决了这个问题。
-
谢谢,我正在寻找有关 url 重写和加密的示例。
标签: java url servlets request servlet-filters