`
hyj1254
  • 浏览: 339842 次
  • 性别: 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,难怪刷新不生效,原来要在地址栏按回车键! 

相关推荐

    web浏览器-缓存详解

    1. HTTP缓存:基于HTTP协议的缓存机制,主要通过HTTP响应头中的Cache-Control、Expires、ETag、Last-Modified等字段来控制缓存行为。 - Cache-Control:用于设置缓存策略,如max-age指示资源的有效期,no-cache则...

    Apache PHP利用HTTP缓存协议原理解析及应用

    ### Apache PHP利用HTTP缓存协议原理解析及应用 HTTP缓存机制是现代网络架构中不可或缺的一部分,旨在提高数据传输效率、减少网络延迟并降低服务器负载。本文将深入解析Apache和PHP如何通过HTTP缓存协议优化网站...

    httpServer的使用.docx

    - `-c`:设置缓存控制头 `max-age` 的值,`-c-1` 可禁用缓存。 - `-U` 或 `--utc`:在日志中使用 UTC 时间格式。 - `-P` 或 `--proxy`:配置代理,转发不能在本地解析的请求。 - `-S` 或 `--ssl`:启用 HTTPS 安全...

    httpHeader详解

    了解HTTP头是深入理解HTTP协议的关键,因为HTTP头包含了请求和响应中的各种元信息,如内容类型、编码、缓存控制、安全设置等。以下是对HTTP头的详细讲解: 1. **请求头(Request Headers)**:当客户端(如浏览器)...

    http.zip_规范的包文

    - Cache-Control:通过设置指令控制缓存行为,如max-age指定缓存有效时间。 - Expires:指定资源过期的绝对时间。 - ETag和If-None-Match:通过实体标签验证资源是否已更新。 - Last-Modified和If-Modified-...

    dio-http-cache:Flutter dio的http缓存库,例如RxCache

    dio-http缓存 Dio-http-cache是的缓存库 ,就像Android中的一样。 Dio-http-cache使用作为... 为请求设置maxAge: Dio (). get ( "http://www.google.com" , options : buildCacheOptions ( Duration (days : 7 )

    网络技术协议-HTTP协议

    - **max-age=**:指示响应可以被缓存的时间长度,单位为秒。 - **min-fresh=**:指示希望响应的新鲜度最小值。 - **max-stale=[]**:允许返回过期响应,可指定最大过期时间。 - **must-revalidate**:缓存必须在数据...

    初探浏览器缓存实现原理-提高性能

    - `Pragma: no-cache`:HTTP/1.0标准,提示不应缓存响应。 - `Cache-Control`: HTTP/1.1标准,控制缓存行为。例如,`public`表示响应可被任何缓存机制存储,`private`表示仅能被单个用户缓存,`no-cache`要求验证...

    Redis最全详解与集群

    - 强制缓存:根据HTTP头信息(Cache-Control: max-age 或 Expires)判断资源是否过期,若未过期则直接使用缓存。 - 协商缓存:通过HTTP头信息(If-Modified-Since 和 If-None-Match)询问服务器资源是否更新,若未...

    http cache-control详解

    HTTP 缓存是提高网页加载速度和降低服务器压力的关键机制,它主要由HTTP消息头中的`Cache-Control`字段控制。`Cache-Control`指令允许服务器告诉客户端(如浏览器)如何处理缓存的响应。理解并正确使用`Cache-...

    实验二 应用层协议分析实验报告

    - Cache-Control: max-age=0, no-cache, no-store, must-revalidate - Pragma: no-cache - Expires: Sat, 01 Jan 2000 00:00:00 GMT - Content-Type: text/html;charset=UTF-8 4. **其他信息** - 本机IP地址:...

    apache提示没有设置 max-age or expires解决办法.docx

    Apache服务器在处理HTTP请求时,有时会提示“没有设置max-age或expires”,这通常是由于缺少对缓存控制的配置导致的。Apache服务器的缓存控制是通过HTTP响应头中的Cache-Control字段来实现的,它允许服务器指定...

    HTTP网络缓存代码实例

    - `Cache-Control`: 这个头部提供了更精细的缓存控制,可以设置`max-age`来指定资源的有效时间,或者设置`no-cache`禁止强缓存,`must-revalidate`要求每次请求都与服务器确认。 - `Expires`: 是一个相对时间的头部...

    浏览器HTTP缓存运行机制流程图.zip

    - `Cache-Control`: 更现代的控制方式,它允许更精确地设置缓存策略,如`max-age`表示资源的有效期,值为秒。若`Cache-Control: max-age=3600`,则表示资源1小时内有效。 - `Expires`: 是HTTP/1.0时代的字段,指定了...

    connect-cache-control2:连接中间件以轻松处理缓存控制

    连接缓存控制2 连接中间件以轻松处理缓存控制 用法 要使用中间件,只需导入withCacheControl函数并为所需的一条或多条路线创建中间件。 const withCacheControl = require ( 'connect-cache-control2' ) . ...

    Http页面缓存机制(转)

    - `Cache-Control` 是HTTP/1.1中的头部字段,功能更强大,可以设置多种控制策略,如 `max-age` 指定了资源的有效时间。 ### 3. 协商缓存 当强缓存未命中时,浏览器会通过协商缓存来判断本地资源是否可用。协商缓存...

    Cache-control使用Cache-control:private学习笔记

    在HTTP协议中,Cache-Control头字段是用于管理缓存行为的关键机制,它允许服务器指示客户端如何缓存响应内容。`Cache-Control`字段可以接受多种指令,以控制网页的缓存策略。在本文中,我们将深入探讨`Cache-Control...

    HTTP常见请求和响应头说明1

    3. Cache-Control: 控制缓存行为,如public、private、max-age。 4. Connection: 可能包含Keep-Alive来保持持久连接。 5. Content-Encoding: 响应体的压缩格式,如gzip。 6. Content-Language: 响应内容的语言。 7. ...

    Web应用安全:HTTP回应报文.pptx

    - `Cache-Control`:控制缓存策略,如`private`、`public`、`no-cache`、`max-age`和`no-store`。 - `private`:仅允许客户端缓存。 - `public`:客户端和代理服务器都可以缓存。 - `max-age=xxx`:缓存内容将在...

    超文本传输协议_--_HTTP1[1].1(RFC_2616中文版)_下.txt

    当 `Cache-Control` 设置了 `max-age` 时,即使 `Expires` 指定了一个更早的过期时间,缓存也会遵循 `max-age` 的值。这是因为 `Cache-Control` 更加精确并且支持更多的缓存指令。 ##### 3. 日期处理 HTTP 使用...

Global site tag (gtag.js) - Google Analytics