`
hyj1254
  • 浏览: 335581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

http协议-缓存控制:max-age

 
阅读更多
   打算将cache-control的各个值都试一遍,看看最终效果是否和预期一致。
   先尝试max-age。其作用是:假如请求了服务器并在a时刻返回响应结果,则在max-age规定的秒数内,浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。
   设置max-age的方式是tomcat的filter。
package itims;
public class TestHTTP implements Filter{
	private static transient Log logger = LogFactory.getLog(TestHTTP.class); 
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest servletrequest,
			ServletResponse servletresponse, FilterChain filterchain)
			throws IOException, ServletException {
		filterchain.doFilter(servletrequest, servletresponse);
		if (servletrequest instanceof HttpServletRequest && servletresponse instanceof HttpServletResponse) {  
            HttpServletRequest request = (HttpServletRequest) servletrequest;  
            HttpServletResponse response = (HttpServletResponse) servletresponse;  
             logger.info("request.getRequestURI:"+request.getRequestURI());
                response.setHeader("Cache-Control", "max-age=" + cacheTime);  
        }
	}
	@Override
	 public void init(FilterConfig arg0) throws ServletException {   
         } 
}

web.xml,只针对js和css文件进行设置。
	<filter>
		 <filter-name>cache-filter</filter-name>
		 <filter-class>itims.TestHTTP</filter-class>
		 <init-param>
            <param-name>cache-time</param-name>
            <param-value>30</param-value>
         </init-param>
	</filter>
	
	<filter-mapping>
        <filter-name>cache-filter</filter-name>
        <url-pattern>*.js</url-pattern>
    </filter-mapping>
    
    <filter-mapping>
        <filter-name>cache-filter</filter-name>
        <url-pattern>*.css</url-pattern>
	</filter-mapping>

httpTest.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
	String path = (String) request.getContextPath();
%>
<html>
	<head>
		<!--  
		<meta http-equiv="refresh" content="5;url=http://localhost:8088/itims/testRRD.action">
		-->
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
		<script type="text/javascript" src="<%=path%>/widget/jquery/jquery-1.3.2.min.js"></script>
		<title>httpTest</title>
	</head>
	<body>
		<p>
			success!
		</p>
	</body>
</html>

在浏览器内输入httpTest.jsp,则抓取的请求/响应信息如下:
http://localhost:8088/itims/widget/jquery/jquery-1.3.2.min.js

GET /itims/widget/jquery/jquery-1.3.2.min.js HTTP/1.1
Host: localhost:8088
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0
Accept: */*
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost:8088/itims/springTest.jsp
Cookie: JSESSIONID=4B83B20F13BBCD37D1C0FB406807FA75
If-Modified-Since: Sun, 28 Aug 2011 13:06:44 GMT
If-None-Match: W/"57254-1314536804640"

HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
Etag: W/"57254-1314536804640"
Cache-Control: max-age=30
Date: Sun, 28 Aug 2011 13:19:35 GMT

jquery-1.3.2.min.js的max-age被设置为30秒。即30秒内,无论用户在浏览器地址栏上敲多少次回车,后台也不应该打印日志,而我这个信息抓取工具也不应该抓取到任何信息。事实的确如此。注意,不同的操作方式影响最终结果,原因是刷新和强制刷新会额外发送cache-control信息。
f5或刷新按钮:cache-control:max-age=0
ctrl+f5:cache-control:no-cache
        pragma:no-cache
疑难杂症:
1、为什么把缓存清干净并访问页面后,再次通过按回车访问页面时,浏览器却不再发送请求了,而按f5又可以?
   答:观察响应信息可知,把缓存清干净后cache-control的设置消失了,原因不明。如果按回车,则此时缓存永远都起作用,自然不用访问服务器;而按f5则是强制访问,且此时cache-control的设置又能出现,所以之后所有的访问都遵循cache-control的设置。
分享到:
评论
2 楼 lwyrain 2012-07-06  
好东西谢谢啦
1 楼 paradigm 2011-11-09  
thank you,难怪刷新不生效,原来要在地址栏按回车键! 

相关推荐

Global site tag (gtag.js) - Google Analytics