嵌入式Tomcat的简单实例,其中包含 Servlet 和过滤器:
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");
网址过滤实施:
@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过滤器的正确方法是什么,以便我可以在传递响应之前仔细检查请求周围的参数?
答案 0 :(得分:1)
查看sendRedirect()的JavaDocs。你告诉客户每个请求返回/ Servlet1,但是你无限期地过滤它。在某些时候,您需要停止在过滤器中发送重定向!
澄清一些。如果您不打算主动过滤请求,您唯一需要做的就是调用
filterChain.dofilter(request, response);
除非您真的想发送HTTP 302(临时重定向),否则不要发回重定向。 Servlet过滤器链是servlet过程的一个重要部分,虽然它看似违反直觉,但您可以通过调用filterChain.doFilter命令使过滤器看起来什么都不做,该命令允许请求继续执行由您配置的其他过滤器。应用服务器。
我不清楚过滤器正在尝试过滤的内容。如果您打算按URL过滤,那么您应该查找匹配的网址,然后仅在匹配时重定向。
答案 1 :(得分:0)
由于这解决了您的问题,请将其作为答案发布。
首先,您需要确保 要么在应用程序过滤器链中传递请求,要么重定向它:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
Boolean filtered = false;
System.out.println("request intercepted");
if (!filtered) {
filtered = true;
((HttpServletResponse) response).sendRedirect("/Servlet1");
return;
}
filterChain.doFilter(request, response);
}
然后,您需要确保过滤器知道传入请求何时已被重定向,以便它不会再次重定向:
@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 = (Boolean) request.getAttribute("filtered");
}
if (!filtered) {
request.setAttribute("filtered", Boolean.TRUE);
((HttpServletResponse) response).sendRedirect("/Servlet1");
return;
}
filterChain.doFilter(request, response);
}