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

转:http://hyj1254.iteye.com/blog/1159931

 

打算将cache-control的各个值都试一遍,看看最终效果是否和预期一致。
   先尝试max-age。其作用是:假如请求了服务器并在a时刻返回响应结果,则在max-age规定的秒数内,浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。
   设置max-age的方式是tomcat的filter。

Java代码 复制代码  收藏代码
  1. package itims;   
  2. public class TestHTTP implements Filter{   
  3.     private static transient Log logger = LogFactory.getLog(TestHTTP.class);    
  4.     @Override  
  5.     public void destroy() {   
  6.            
  7.     }   
  8.   
  9.     @Override  
  10.     public void doFilter(ServletRequest servletrequest,   
  11.             ServletResponse servletresponse, FilterChain filterchain)   
  12.             throws IOException, ServletException {   
  13.         filterchain.doFilter(servletrequest, servletresponse);   
  14.         if (servletrequest instanceof HttpServletRequest && servletresponse instanceof HttpServletResponse) {     
  15.             HttpServletRequest request = (HttpServletRequest) servletrequest;     
  16.             HttpServletResponse response = (HttpServletResponse) servletresponse;     
  17.              logger.info("request.getRequestURI:"+request.getRequestURI());   
  18.                 response.setHeader("Cache-Control""max-age=" + cacheTime);     
  19.         }   
  20.     }   
  21.     @Override  
  22.      public void init(FilterConfig arg0) throws ServletException {      
  23.          }    
  24. }  
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文件进行设置。
Xml代码 复制代码  收藏代码
  1. <filter>  
  2.      <filter-name>cache-filter</filter-name>  
  3.      <filter-class>itims.TestHTTP</filter-class>  
  4.      <init-param>  
  5.            <param-name>cache-time</param-name>  
  6.            <param-value>30</param-value>  
  7.         </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.        <filter-name>cache-filter</filter-name>  
  12.        <url-pattern>*.js</url-pattern>  
  13.    </filter-mapping>  
  14.       
  15.    <filter-mapping>  
  16.        <filter-name>cache-filter</filter-name>  
  17.        <url-pattern>*.css</url-pattern>  
  18. </filter-mapping>  

httpTest.jsp
Html代码 复制代码  收藏代码
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <%   
  5.     String path = (String) request.getContextPath();   
  6. %>  
  7. <html>  
  8.     <head>  
  9.         <!--    
  10.         <meta http-equiv="refresh" content="5;url=http://localhost:8088/itims/testRRD.action">  
  11.         -->  
  12.         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
  13.         <script type="text/javascript" src="<%=path%>/widget/jquery/jquery-1.3.2.min.js"></script>  
  14.         <title>httpTest</title>  
  15.     </head>  
  16.     <body>  
  17.         <p>  
  18.             success!   
  19.         </p>  
  20.     </body>  
  21. </html>  
<%@ 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,则抓取的请求/响应信息如下:
Java代码 复制代码  收藏代码
  1. http://localhost:8088/itims/widget/jquery/jquery-1.3.2.min.js   
  2.   
  3. GET /itims/widget/jquery/jquery-1.3.2.min.js HTTP/1.1  
  4. Host: localhost:8088  
  5. User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0  
  6. Accept: */*   
  7. Accept-Language: zh-cn,zh;q=0.5  
  8. Accept-Encoding: gzip, deflate   
  9. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7  
  10. Connection: keep-alive   
  11. Referer: http://localhost:8088/itims/springTest.jsp   
  12. Cookie: JSESSIONID=4B83B20F13BBCD37D1C0FB406807FA75   
  13. If-Modified-Since: Sun, 28 Aug 2011 13:06:44 GMT   
  14. If-None-Match: W/"57254-1314536804640"  
  15.   
  16. HTTP/1.1 304 Not Modified   
  17. Server: Apache-Coyote/1.1  
  18. Etag: W/"57254-1314536804640"  
  19. Cache-Control: max-age=30  
  20. Date: Sun, 28 Aug 2011 13:19:35 GMT  
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的设置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值