servlet链过滤器

Pro*_*aos 2 java tomcat servlets servlet-filters

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

这是我尝试过的概要(我从这个问题中得到了大部分内容)

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); 
    ..
  }
}
Run Code Online (Sandbox Code Playgroud)

这在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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 9

FilterChain#doFilter()继续的请求处理,只有当目标控制器已经完成了他们的工作和响应被渲染并致力于返回.

你应该不会,如果你的目的是通过改变请求到不同的服务器端目的地调用它RequestDispatcher#forward()(或当你想让客户端发送一个新的请求HttpServletResponse#sendRedirect()).您应该通过查看IllegalStateException: response already committed服务器日志来注意到这一点.

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

request.getRequestDispatcher("/Translate").forward(request, response); 
Run Code Online (Sandbox Code Playgroud)

或使其成为有条件的

if (someCondition) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/Translate").forward(request, response); 
}
Run Code Online (Sandbox Code Playgroud)

具体问题无关,如果我理解/猜测你的实际功能需求,你就更需要RequestDispatcher#include()/processservlet中寻找.另请参阅如何按顺序执行多个servlet?