前言: 网页的缓存情况可以通过设置网页的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
=
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>