servlet链过滤器

时间:2012-01-24 16:13:43

标签: java tomcat servlets servlet-filters

如何编写过滤器类以将响应从一个servlet传递到另一个servlet以及GET参数?

这是我尝试过的概要(我从this question得到了大部分内容)

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TranslateFilter implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {

    chain.doFilter(request, response);
    ..

    RequestDispatcher dispatch = request.getRequestDispatcher("/Translate");
    dispatch.forward(request, response); 
    ..
  }
}

,这在web.xml中

<servlet-mapping>
    <servlet-name>process</servlet-name>
    <url-pattern>/Process
</servlet-mapping>

<servlet-mapping>
    <servlet-name>translate</servlet-name>
    <url-pattern>/Translate
</servlet-mapping>

<filter-mapping>
    <filter-name>processChain</filter-name>
    <servlet-name>process</servlet-name>
</filter-mapping>

但它不起作用。它不会转发到第二个servlet。我没有调试环境设置,所以我不知道它在哪里失败,但是有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:9)

FilterChain#doFilter()继续请求处理,仅在目标控制器完成其作业并且已呈现并提交响应时返回。

如果您的目的是通过RequestDispatcher#forward()将请求更改为其他服务器端目标(或者您希望让客户端通过以下方式发送新请求),则将调用它HttpServletResponse#sendRedirect())。您应该通过在服务器日志中看到IllegalStateException: response already committed来注意到这一点。

所以,要么删除它,以便你最终只有前进,

request.getRequestDispatcher("/Translate").forward(request, response); 

或使其成为条件

if (someCondition) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/Translate").forward(request, response); 
}

无关具体问题,如果我理解/猜测您的实际功能需求,那么您需要在RequestDispatcher#include() servlet中寻找/process。另请参阅How do I execute multiple servlets in sequence?