servlet 链过滤器
Posted
技术标签:
【中文标题】servlet 链过滤器【英文标题】:servlet chain filter 【发布时间】:2012-02-17 21:29:43 【问题描述】:如何编写一个过滤器类来将响应与 GET 参数一起从一个 servlet 传递到另一个?
这是我尝试过的大纲(大部分来自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。我没有调试环境设置,所以我不知道它在哪里失败,但有人能指出我正确的方向吗?
【问题讨论】:
chain.doFilter(request, response);
这是有条件的吗?
@JigarJoshi 你问它是否返回布尔值?
您为什么不将此作为原始问题的一部分发布?您省略了我提供的答案的一些重要细节,即您应该传递一个充当缓冲区而不是原始响应对象的响应包装器。
@kschneid 以前我没有意识到使用过滤器可以解决我的问题;我的第一个问题非常笼统。我试图实现过滤器,但我还没有完成。在这篇文章中,我试图获得一些关于实现过滤器的答案。
【参考方案1】:
FilterChain#doFilter()
继续处理请求,并且仅在目标控制器完成其工作并且响应已呈现并提交时返回。
如果您的意图是通过RequestDispatcher#forward()
将请求更改为不同的服务器端目的地(或者当您希望通过@987654324 让客户端发送新请求时,您应该不调用它@)。通过在服务器日志中看到 IllegalStateException: response already committed
,您应该已经注意到了这一点。
所以,要么删除它,让你只剩下前锋,
request.getRequestDispatcher("/Translate").forward(request, response);
或使其成为条件
if (someCondition)
chain.doFilter(request, response);
else
request.getRequestDispatcher("/Translate").forward(request, response);
与具体问题无关,如果我正确理解/猜到您的实际功能需求,您更多的是在/process
servlet 中寻找RequestDispatcher#include()
。另见How do I execute multiple servlets in sequence?
【讨论】:
如果您查看原始问题以及我对这个问题的评论,您会注意到一些重要的细节被省略了......以上是关于servlet 链过滤器的主要内容,如果未能解决你的问题,请参考以下文章