filter的困惑,求解

aspirerME 2010-02-02 02:06:50


这段代码是有效的

代码1:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);

filterChain.doFilter(request, response);
}

但写成这样就无效

代码2:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
filterChain.doFilter(request, response);

((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);

}

按照我的理解应该在“doFilter”之前处理request在“doFilter”之后处理response才符合逻辑。但实际上代码1是正确的,望专家解惑。



...全文
261 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq513666573 2010-02-22
  • 打赏
  • 举报
回复
引用 1 楼 lxd520123 的回复:
这就一个顺序执行吧
你第2个response的都没接收到你的设置你就执行方法
而执行到下面的时候,response设置了,缺没有去执行方法

((HttpServletResponse) response).set***();
这个是对 response属性进行设置

赞同。。
aspirerME 2010-02-22
  • 打赏
  • 举报
回复
还有更深入一点的解释吗
aspirerME 2010-02-08
  • 打赏
  • 举报
回复
还有更深入一点的解释吗
ChDw 2010-02-04
  • 打赏
  • 举报
回复
其实这里的关键在于
filterChain.doFilter(request, response);
调用之后,可能由于你调用了flushBuffer,或者返回页面太大了超过了Buffer的限制

Tomcat已经开始将ResponseBuffer中的数据开始返回到客户端了,这样Response的头信息也已经发送回客户端了。所以在doFilter之后的setHeader已经无法再通知客户端了

如果doFilter中输出内容很小,有可能成功的。
烟雨鹏城 2010-02-04
  • 打赏
  • 举报
回复
filterChain.doFilter(request, response);
我晕,doFilter表示都过滤完成啦,你在下面设置还有什么用
aspirerME 2010-02-04
  • 打赏
  • 举报
回复
up
xuexijava 2010-02-03
  • 打赏
  • 举报
回复
学习帮顶
aspirerME 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gyl05414 的回复:]
filterChain.doFilter简单理解就是放行。。都放行了还能执行下面的语句么
[/Quote]


=============================================================

下面的代码是执行的,可以System.out.println()一下,是有输出的,但是对response的设置是无效的,还有更深入一点的解释吗?
wangxiaoyi2 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yinghan2005 的回复:]
引用 8 楼 gyl05414 的回复:
filterChain.doFilter简单理解就是放行。。都放行了还能执行下面的语句么

同意


[/Quote]
同意
qianmz 2010-02-03
  • 打赏
  • 举报
回复
我的理解是request和response同时存在的,也就是说你在doFilter之后设置response不起效果
ytfvfhpeeq 2010-02-03
  • 打赏
  • 举报
回复
学习!
kaelthasbmg 2010-02-02
  • 打赏
  • 举报
回复
学习学习~~
luhui436 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lrbyantai 的回复:]
你代码2中相当于什么都没干就释放拦截权了!类似于return了

filterChain.doFilter(request, response);    后面的东西是不会走的,因为他的作用就是释放拦截权,进入下一步
[/Quote]
同意
humcomm 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gyl05414 的回复:]
filterChain.doFilter简单理解就是放行。。都放行了还能执行下面的语句么
[/Quote]
同意

weihthchk 2010-02-02
  • 打赏
  • 举报
回复
下面的语句还是会执行的,不过response的content已经写到网络流中了,那么header应该就不能再设置了。因为header应该在content之前写到网络流中。
  • 打赏
  • 举报
回复
filterChain.doFilter简单理解就是放行。。都放行了还能执行下面的语句么
bayougeng 2010-02-02
  • 打赏
  • 举报
回复
把你的三条代码注释掉正常么?
d_star 2010-02-02
  • 打赏
  • 举报
回复
楼上的说得对
reandyner 2010-02-02
  • 打赏
  • 举报
回复
设置resquest与response都得在使用它们之前才有效,
代码2将设置放在后面,response 输出流已经封装好了,当然再设置就无效了
kksss 2010-02-02
  • 打赏
  • 举报
回复
filterChain.doFilter(request, response);

之后调用servlet的方法这时response没有设置
response 通过一系列操作
如果生成了什么已经成为一个结果了类似于可以理解为:已经输出到页面但实际没有


之后在设置
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);
不能影响前面的response的结果
加载更多回复(3)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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