一些动态页面中可能会包含一些修饰页面样式的js和css文件,这些文件对这个网页来说,是相对较长时间不会发生变化的,因此这些文件在第一次访问这些页面时,可以实现让浏览器将其缓存下来,这样可以避免每次访问此网页时,多次下载此文件,加速了访问速度。另外为了避免长时间不访问此网页,而起相关的类似js和css的静态资源一直被缓存着,可以设置其缓存时间,在此时间内,对其进行缓存,超过此时间,将其从缓存中清空。
利用过滤器技术,可以实现上述功能,在给出示例代码前,需要解释下,如何控制缓存一个文件的时间,如下:
response.setDateHeader("expires", System.currentTimeMillis()+value);通过此可以设置缓存时间;
下面是一个示例,此例子可扩展性较强,此例子可以缓存css,js,jpg等
//Filter<filter> <filter-name>StaticContentFilter</filter-name> <filter-class>cn.itcast.utils.StaticContentFilter</filter-class> <init-param> <param-name>css</param-name> <param-value>10</param-value> </init-param> <init-param> <param-name>js</param-name> <param-value>20</param-value> </init-param> <init-param> <param-name>jpg</param-name> <param-value>30</param-value> </init-param> </filter> <filter-mapping> <filter-name>StaticContentFilter</filter-name> <url-pattern>*.jpg</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
public class StaticContentFilter implements Filter { private FilterConfig config; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub //类型转换 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //获取资源类型 String uri = request.getRequestURI(); String type = uri.substring(uri.lastIndexOf(".")+1); String time = config.getInitParameter(type); System.out.println(type+":"+time); //设置缓存时间 if(time!=null){ System.out.println(type+":"+time); int value = (int) (Long.parseLong(time)*1000); response.setDateHeader("expires", System.currentTimeMillis()+value); } chain.doFilter(request, response); } @Override public void init(FilterConfig config) throws ServletException { // TODO Auto-generated method stub this.config = config; } }