这段代码是有效的代码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是正确的,望专家解惑。

解决方案 »

  1.   

    这就一个顺序执行吧
    你第2个response的都没接收到你的设置你就执行方法
    而执行到下面的时候,response设置了,缺没有去执行方法((HttpServletResponse) response).set***();
    这个是对 response属性进行设置
      

  2.   

    你代码2中相当于什么都没干就释放拦截权了!类似于return了filterChain.doFilter(request, response);    后面的东西是不会走的,因为他的作用就是释放拦截权,进入下一步
      

  3.   

    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的结果
      

  4.   

    设置resquest与response都得在使用它们之前才有效,
    代码2将设置放在后面,response 输出流已经封装好了,当然再设置就无效了
      

  5.   

    filterChain.doFilter简单理解就是放行。。都放行了还能执行下面的语句么
      

  6.   

    下面的语句还是会执行的,不过response的content已经写到网络流中了,那么header应该就不能再设置了。因为header应该在content之前写到网络流中。
      

  7.   

    =============================================================下面的代码是执行的,可以System.out.println()一下,是有输出的,但是对response的设置是无效的,还有更深入一点的解释吗?
      

  8.   

     我的理解是request和response同时存在的,也就是说你在doFilter之后设置response不起效果
      

  9.   

    filterChain.doFilter(request, response);  
    我晕,doFilter表示都过滤完成啦,你在下面设置还有什么用
      

  10.   

    其实这里的关键在于
    filterChain.doFilter(request, response);
    调用之后,可能由于你调用了flushBuffer,或者返回页面太大了超过了Buffer的限制Tomcat已经开始将ResponseBuffer中的数据开始返回到客户端了,这样Response的头信息也已经发送回客户端了。所以在doFilter之后的setHeader已经无法再通知客户端了如果doFilter中输出内容很小,有可能成功的。