关于Filter截取到response返回数据的问题

ladofwind 2006-04-10 12:53:35
在filter的doFilter中要传入一个包装好的ServletResponse,
类如下,请问为什么这样写就能拿到response返回的数据,
private CharArrayWriter output明明是自己定义的一个
私有成员变量,为什么把这个类的对象传入doFilter,output
就成了response的输出流了呢?
这后面具体的原理谁能说清楚啊?谢谢大虾们,踊跃回答,参与者有分



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class FileCaptureResponseWrapper
 extends HttpServletResponseWrapper
 {
  private CharArrayWriter output;
  public String toString()
  {
   return output.toString();
  }
  public FileCaptureResponseWrapper(HttpServletResponse response)
  {
   super(response);
   output = new CharArrayWriter();
  }

  public PrintWriter getWriter()
  {
   return new PrintWriter(output);
  }

  public void writeFile(String fileName)
   throws IOException
   {
    FileWriter fw = new FileWriter(fileName);
    fw.write( output.toCharArray() );
    fw.close();
   }

  public void writeResponse(PrintWriter out)
  {
   out.print( output.toCharArray() );
  }
 }
...全文
1435 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingofhawks 2006-04-17
  • 打赏
  • 举报
回复
去看看servlet fileter SPEC
ladofwind 2006-04-11
  • 打赏
  • 举报
回复
?
ladofwind 2006-04-11
  • 打赏
  • 举报
回复
晕,没人能说清楚?
ladofwind 2006-04-10
  • 打赏
  • 举报
回复
上面兄弟能详细说说吗?我怎么知道容器会调用哪几个函数啊,
从而确定我必须override哪个函数呢?
kingofhawks 2006-04-10
  • 打赏
  • 举报
回复
callBack函数,容器会自动识别这些函数并调用.
ladofwind 2006-04-10
  • 打赏
  • 举报
回复
我怎么知道容器会调用哪几个函数啊,
从而确定我必须override哪个函数呢?

HttpServletResponseWrapper
有那么多函数,为什么只重写了这几个呢?
interpb 2006-04-10
  • 打赏
  • 举报
回复
就像applet的 init ,start函数能被浏览器调用一样

这是一样的道理

sbnth 2006-04-10
  • 打赏
  • 举报
回复
一般ide工具就可以查看HttpServletResponseWrapper提供了哪些method啊?
ladofwind 2006-04-10
  • 打赏
  • 举报
回复
没人解释清楚吗?
ladofwind 2006-04-10
  • 打赏
  • 举报
回复
我的filter就是把 new 了一个FileCaptureResponseWrapper对象比如叫fres,传入doFilter方法执行了一下,
然后fres.toString(),就能捕获返回的数据,我是不明白这背后的机制,为什么就通过包装的这个类,就能截获返回的数据,这些自己定义的方法和变量,怎么保证会被执行
interpb 2006-04-10
  • 打赏
  • 举报
回复
你的filter是怎么定义的
ladofwind 2006-04-10
  • 打赏
  • 举报
回复
我的意思是,你自己定义的方法,为什么doFilter会调用
interpb 2006-04-10
  • 打赏
  • 举报
回复
public void writeResponse(PrintWriter out)
  {
   out.print( output.toCharArray() );
  }

这个方法很清楚啊

拦截住原来内容,而向客户端输出output的内容

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧