前言: 网页的缓存情况可以通过设置网页的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 >
<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 ;
}
}
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 = 604800, public < /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>
<!-- 不进行缓存 -->
<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 = 604800, public < /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>