【问题标题】:servlet chain filterservlet 链过滤器
【发布时间】: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 以前我没有意识到使用过滤器可以解决我的问题;我的第一个问题非常笼统。我试图实现过滤器,但我还没有完成。在这篇文章中,我试图获得一些关于实现过滤器的答案。

标签: java tomcat servlets servlet-filters


【解决方案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?

【讨论】:

  • 如果您查看原始问题以及我对这个问题的评论,您会注意到一些重要的细节被省略了......
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2011-02-26
  • 2013-04-09
  • 1970-01-01
  • 2014-04-07
  • 2014-02-12
  • 2010-12-30
  • 2015-09-06
相关资源
最近更新 更多