打算将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的设置。
分享到:
相关推荐
1. HTTP缓存:基于HTTP协议的缓存机制,主要通过HTTP响应头中的Cache-Control、Expires、ETag、Last-Modified等字段来控制缓存行为。 - Cache-Control:用于设置缓存策略,如max-age指示资源的有效期,no-cache则...
- `-c`:设置缓存控制头 `max-age` 的值,`-c-1` 可禁用缓存。 - `-U` 或 `--utc`:在日志中使用 UTC 时间格式。 - `-P` 或 `--proxy`:配置代理,转发不能在本地解析的请求。 - `-S` 或 `--ssl`:启用 HTTPS 安全...
了解HTTP头是深入理解HTTP协议的关键,因为HTTP头包含了请求和响应中的各种元信息,如内容类型、编码、缓存控制、安全设置等。以下是对HTTP头的详细讲解: 1. **请求头(Request Headers)**:当客户端(如浏览器)...
- Cache-Control:通过设置指令控制缓存行为,如max-age指定缓存有效时间。 - Expires:指定资源过期的绝对时间。 - ETag和If-None-Match:通过实体标签验证资源是否已更新。 - Last-Modified和If-Modified-...
dio-http缓存 Dio-http-cache是的缓存库 ,就像Android中的一样。 Dio-http-cache使用作为... 为请求设置maxAge: Dio (). get ( "http://www.google.com" , options : buildCacheOptions ( Duration (days : 7 )
- **max-age=**:指示响应可以被缓存的时间长度,单位为秒。 - **min-fresh=**:指示希望响应的新鲜度最小值。 - **max-stale=[]**:允许返回过期响应,可指定最大过期时间。 - **must-revalidate**:缓存必须在数据...
- `Pragma: no-cache`:HTTP/1.0标准,提示不应缓存响应。 - `Cache-Control`: HTTP/1.1标准,控制缓存行为。例如,`public`表示响应可被任何缓存机制存储,`private`表示仅能被单个用户缓存,`no-cache`要求验证...
- 强制缓存:根据HTTP头信息(Cache-Control: max-age 或 Expires)判断资源是否过期,若未过期则直接使用缓存。 - 协商缓存:通过HTTP头信息(If-Modified-Since 和 If-None-Match)询问服务器资源是否更新,若未...
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服务器在处理HTTP请求时,有时会提示“没有设置max-age或expires”,这通常是由于缺少对缓存控制的配置导致的。Apache服务器的缓存控制是通过HTTP响应头中的Cache-Control字段来实现的,它允许服务器指定...
- `Cache-Control`: 这个头部提供了更精细的缓存控制,可以设置`max-age`来指定资源的有效时间,或者设置`no-cache`禁止强缓存,`must-revalidate`要求每次请求都与服务器确认。 - `Expires`: 是一个相对时间的头部...
- `Cache-Control`: 更现代的控制方式,它允许更精确地设置缓存策略,如`max-age`表示资源的有效期,值为秒。若`Cache-Control: max-age=3600`,则表示资源1小时内有效。 - `Expires`: 是HTTP/1.0时代的字段,指定了...
连接缓存控制2 连接中间件以轻松处理缓存控制 用法 要使用中间件,只需导入withCacheControl函数并为所需的一条或多条路线创建中间件。 const withCacheControl = require ( 'connect-cache-control2' ) . ...
- `Cache-Control` 是HTTP/1.1中的头部字段,功能更强大,可以设置多种控制策略,如 `max-age` 指定了资源的有效时间。 ### 3. 协商缓存 当强缓存未命中时,浏览器会通过协商缓存来判断本地资源是否可用。协商缓存...
在HTTP协议中,Cache-Control头字段是用于管理缓存行为的关键机制,它允许服务器指示客户端如何缓存响应内容。`Cache-Control`字段可以接受多种指令,以控制网页的缓存策略。在本文中,我们将深入探讨`Cache-Control...
3. Cache-Control: 控制缓存行为,如public、private、max-age。 4. Connection: 可能包含Keep-Alive来保持持久连接。 5. Content-Encoding: 响应体的压缩格式,如gzip。 6. Content-Language: 响应内容的语言。 7. ...
- `Cache-Control`:控制缓存策略,如`private`、`public`、`no-cache`、`max-age`和`no-store`。 - `private`:仅允许客户端缓存。 - `public`:客户端和代理服务器都可以缓存。 - `max-age=xxx`:缓存内容将在...
当 `Cache-Control` 设置了 `max-age` 时,即使 `Expires` 指定了一个更早的过期时间,缓存也会遵循 `max-age` 的值。这是因为 `Cache-Control` 更加精确并且支持更多的缓存指令。 ##### 3. 日期处理 HTTP 使用...