http304状态码缓存设置问题
当浏览器第一次加载资源的时候,返回一般为200,意思是成功获取资源,并会在浏览器的缓存中记录下max-age,第二次访问的时候:
如果只是用浏览器打开,那么浏览器会去判断这个资源在缓存里有没有,如果有的话,会去判断max-age,看看过期没有,如果没有过期,则直接读缓存,根本不会和服务器进行交互,换句话说,断网都能打开,就和本地跑一样!如果已经过期了,那就去服务器请求,等待服务器响应,这是很费时间的,服务器如果发现资源没有改变过,那么就会返回304,告诉浏览器,我没变过,你去读缓存吧,于是浏览器也不用从服务器拉数据了,然而,等待服务器响应也是一个很要命的问题,在网速发达的今天,等一个响应,有时比下载还慢。
如果是用浏览器刷新的,那么浏览器不会去判断max-age了,直接去服务器拿,如果服务器判断资源没变过,则还是会返回304,和上面是一样的,所以刷新一下,其实很可怕,等于把所有的资源都要去服务器请求一边,问问服务器我过期了没有。
综上,尽量减少网页的资源数量!尽量合并JS CSS 图片!响应速度将会猛增!
3xx (重定向)
要完成请求,需要进一步操作。通常,这些状态码用来重定向。Google 建议您在每次请求中使用重定向不要超过 5 次。您可以使用网站管理员工具查看一下 Googlebot 在抓取重定向网页时是否遇到问题。诊断下的网络抓取页列出了由于重定向错误导致 Googlebot 无法抓取的网址。
300(多种选择) | 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 |
301(永久移动) | 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。 |
302(临时移动) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动,因为 Googlebot 会继续抓取原有位置并编制索引。 |
303(查看其他位置) | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。 |
304(未修改) |
自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。 . |
305(使用代理) | 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。 |
307(临时重定向) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 <a href=answer.py?answer=>301</a> 代码类似,会自动将请求者转到不同的位置,但您不应使用此代码来告诉 Googlebot 某个页面或网站已经移动,因为 Googlebot 会继续抓取原有位置并编制索引。 |
先尝试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的设置。
http304状态码缓存设置问题的更多相关文章
- PHP HTTP协议(报头/状态码/缓存)
一.HTTP协议介绍 1. #HTTP协议 # (1 建立在TCP/IP协议基础上 # (2 web开发数据传输依赖于http协议 # (3 http 协议全称是文 ...
- HTTP 返回的状态码 != 200 ,浏览器不会将返回的内容缓存到本地磁盘上
今天无意发现的,以前处理HTTP State = 404或403之类的,都是直接返回 HTTP 200 OK,然后加一个缓存设置,例如: Cache-Control: max-age=3600 最近修 ...
- html状态码与缓存学习
当浏览器访问一个页面时,浏览者的浏览器会向网页所在的服务器发送请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...
- 浏览器缓存机制介绍 + 常用 http 状态码
浏览器缓存分为两种, 强制缓存 与 协商缓存, https://www.pass4lead.com/300-209.htmlhttps://www.pass4lead.com/300-320.ht ...
- 区分http请求状态码来理解缓存(协商缓存和强制缓存)
什么是http缓存呢,当我们使用chrome浏览器,按F12打开控制台,在网络请求中有时候看到状态码是200,有时候状态码是304,当我们去看这种请求的时候,我们会发现状态码为304的状态结果是:St ...
- IIS7.0设置404错误页,返回500状态码
一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...
- JavaWeb_Day10_学习笔记1_response(3、4、5、6、7、8、9)发送状态码、响应、重定向、定时刷新、禁用浏览器缓存、响应字节数据、快捷重定向方法、完成防盗链
今天学习重点: 1.response和request响应和应答分别学习: 请求响应流程图 response 1 response概述 response是Servlet.service方法 ...
- 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头
目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...
- LB层到Real Server之间访问请求的响应时间及HTTP状态码监控及报警设置
为了监控到各业务的访问质量,基于LB层的Nginx日志,实现LB层到Real Server之间访问请求的响应时间(即upstream_response_time)及HTTP状态码(即upstream_ ...
随机推荐
- 按键的使用方法(三)-------verilog
按键的使用方法三:一键三用: 点击.长击和双击. 代码: /********************************Copyright***************************** ...
- wp8 入门到精通 LINQ to SQL
http://msdn.microsoft.com/zh-cn/library/bb397924.aspx LINQ 查询操作中的类型关系 (C#) 使用一个人类发明快速检索的方法 // Northw ...
- andorid开发易范的错误
1 写DAO,调用远程API接口返回不来数据,实际这个api接口经过第三方工具测试通过的,原因是没有放到线程里.
- Sql语句里的递归查询(转)
原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243 Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用 ...
- 代码实现UI控件
参考 Android 用纯代码实现复杂界面
- 为什么在SQL Server2008在视图中修改表结构无效
解决办法: 在SQL server 2008 中,打开菜单-->工具
- HDU 5009 Paint Pearls 双向链表优化DP
Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls ha ...
- Codeforces Round #352 (Div. 2) C. Recycling Bottles 贪心
C. Recycling Bottles It was recycling day in Kekoland. To celebrate it Adil and Bera went to Centr ...
- 字符编码GB2312、GBK、UTF-8的区别
本文来自:javaeye网站 UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛 GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大~ 提示:如果您的网站客户群体主要是面 ...
- C#图片处理示例(裁剪,缩放,清晰度,水印)
C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...