利用Filter实现对网页某些特殊属性的设置,例:设置网页的缓存情况

前言: 网页的缓存情况可以通过设置网页的header的Cache-Control变量来实现。

对于网页的缓存原理以及这个Cache-Control值的设定意义请参考,小弟,kaiwii,的博客中的另外一篇文章:

浏览器缓存实现原理

一、设计思路以及代码示例:

1、通过filter对http请求的某些属性值进行设置

因为所有的请求以及响应都必须要通过filter的,所以,我们可以通过filter进行设置。

而浏览器的资源是否会得到缓存,是通过响应的header来设置的。

a、先将需要设置的值,在web.xml中作为filter的初始化变量设置进去,等到web应用起来以后,必定会通过init()方法传递到filter中。

web.xml如下所示:

<!-- 不进行缓存  -->
    <filter >  
        <filter -name >NoCache < /filter -name >  
        <filter - class >com.superkaiwii.core.web.filter.ResponseHeaderFilter < /filter - class >  
        <init -param >  
            <param -name >Cache -Control < /param -name >  
            <param -value >no -cache , must -revalidate < /param -value >  
        < /init -param >  
    < /filter > 
    <filter -mapping >  
         <filter -name >NoCache < /filter -name >  
         <url -pattern >*. do < /url -pattern >  
    < /filter -mapping >  

利用filter对每个请求的header作处理。ResponseHeaderFilter的示例代码如下所示:

import java.io.IOException ;
import java.util.Enumeration ;

import javax.servlet.Filter ;
import javax.servlet.FilterChain ;
import javax.servlet.FilterConfig ;
import javax.servlet.ServletException ;
import javax.servlet.ServletRequest ;
import javax.servlet.ServletResponse ;
import javax.servlet.http.HttpServletResponse ;

public  class ResponseHeaderFilter
  implements Filter
{
   private FilterConfig fc ;

   public  void doFilter (ServletRequest paramServletRequest , ServletResponse paramServletResponse , FilterChain paramFilterChain )
    throws IOException , ServletException
   {
    HttpServletResponse localHttpServletResponse  =  (HttpServletResponse )paramServletResponse ;
    Enumeration localEnumeration  =  this.fc.getInitParameterNames ();
     while  (localEnumeration.hasMoreElements ())
     {
         //每一个通过这个filter的请求,filter都将<init-param>的参数值赋值到响应的header中
      String str  =  (String )localEnumeration.nextElement ();
      localHttpServletResponse.addHeader (str ,  this.fc.getInitParameter (str ));
     }
    paramFilterChain.doFilter (paramServletRequest , localHttpServletResponse );
   }
/**
 * 将web.xml中的<init-param>  值传递过来
 */

   public  void init (FilterConfig paramFilterConfig )
   {
     this.fc  = paramFilterConfig ;
   }

   public  void destroy ()
   {
     this.fc  = null ;
   }
}

 

2、白名单与黑名单结合

因为大部分的资源是不需要缓存的,而少部分(诸如,ext,图片等)的资源需要在短时间内缓存的。

所以,我们可以将全部的请求设置为不缓存,然后将需要缓存的部分再附加设置值。

可以,参考我的web.xml:

/filter >
       <!-- 不进行缓存  -->
    <filter >  
        <filter -name >NoCache < /filter -name >  
        <filter - class >com.superkaiwii.core.web.filter.ResponseHeaderFilter < /filter - class >  
        <init -param >  
            <param -name >Cache -Control < /param -name >  
            <param -value >no -cache , must -revalidate < /param -value >  
        < /init -param >  
    < /filter > 
    <filter -mapping >  
         <filter -name >NoCache < /filter -name >  
         <url -pattern >*. do < /url -pattern >  
    < /filter -mapping >  
    <!-- 进行缓存 ,开发时可去掉该缓存配置 --> 
    <!--max -age = 604800,以秒为单位,这个值即为:一周   -->
    <filter >  
        <filter -name >CacheForWeek < /filter -name >  
        <filter - class >com.superkaiwii.core.web.filter.ResponseHeaderFilter < /filter - class >  
        <init -param >  
            <param -name >Cache -Control < /param -name >  
            <param -value >max -age = 604800public < /param -value >  
        < /init -param >  
    < /filter >
     <filter -mapping >  
         <filter -name >CacheForWeek < /filter -name >  
         <url -pattern > /images /*</url-pattern>  
    </filter-mapping>
    <filter-mapping>  
        <filter-name>CacheForWeek</filter-name>  
        <url-pattern>/ext3/*</url-pattern>  
    </filter-mapping>  
    <filter-mapping>  
        <filter-name>CacheForWeek</filter-name>  
        <url-pattern>/js/*</url-pattern>  
    </filter-mapping>  
    <filter-mapping>  
        <filter-name>CacheForWeek</filter-name>  
        <url-pattern>/css/*</url-pattern>  
    </filter-mapping>   

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值