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 链过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Servlet过滤器——仿盗链过滤器

servlet_4

透过源码学习设计模式1—Servlet Filter和责任链模式

servlet 过滤器 概述

Servlet组件之一——Filter过滤器

设计模式—责任链模式