如何编写过滤器类以将响应从一个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。我没有调试环境设置,所以我不知道它在哪里失败,但是有人能指出我正确的方向吗?
答案 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?