【发布时间】:2014-05-06 14:53:43
【问题描述】:
带有 Servlet 和 Filter 的嵌入式 Tomcat 的简单实例:
Tomcat tomcat = new Tomcat();
Context rootCtx = tomcat.addContext("", base.getAbsolutePath());
FilterDef filterDefinition = new FilterDef();
filterDefinition.setFilterName(URLFilter.class.getSimpleName());
filterDefinition.setFilterClass(URLFilter.class.getName());
rootCtx.addFilterDef(filterDefinition);
FilterMap filter1mapping = new FilterMap();
filter1mapping.setFilterName(URLFilter.class.getSimpleName());
filter1mapping.addURLPattern("/*");
rootCtx.addFilterMap(filter1mapping);
Tomcat.addServlet(rootCtx, "Servlet1", new Servlet1());
rootCtx.addServletMapping("/Servlet1", "Servlet1");
URL 过滤器实现:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
Boolean filtered = false;
System.out.println("request intercepted");
if (request.getAttribute("filtered") != null) {
filtered = true;
request.setAttribute("filtered", filtered);
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/Servlet1");
return;
} else {
filterChain.doFilter(request, response);
}
}
由于某种原因,这最终会陷入无限循环,并且永远不会到达 Servlet1。实现 URL 过滤器的正确方法是什么,以便我可以在传递响应之前仔细检查请求周围的参数?
【问题讨论】:
-
您似乎错过了对
chain.doFilter(request, response)的呼叫。如果将其包含在doFilter方法的末尾,行为会改变吗? -
道歉 - 我最初的评论很仓促,而且不够具体。仅当您不发送重定向时才需要调用
doFilter。当你重定向你应该只是return;之后,doFilter是你不重定向的时候。 -
如果您要进行大量重定向,请查看UrlRewriteFilter。它就是为此目的而制作的。
标签: java tomcat servlets embedded-tomcat-7 tomcat8