当浏览器第一次加载资源的时候,返回一般为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 会继续抓取原有位置并编制索引。
打算将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. @Override
  8. public void doFilter(ServletRequest servletrequest,
  9. ServletResponse servletresponse, FilterChain filterchain)
  10. throws IOException, ServletException {
  11. filterchain.doFilter(servletrequest, servletresponse);
  12. if (servletrequest instanceof HttpServletRequest && servletresponse instanceof HttpServletResponse) {
  13. HttpServletRequest request = (HttpServletRequest) servletrequest;
  14. HttpServletResponse response = (HttpServletResponse) servletresponse;
  15. logger.info("request.getRequestURI:"+request.getRequestURI());
  16. response.setHeader("Cache-Control", "max-age=" + cacheTime);
  17. }
  18. }
  19. @Override
  20. public void init(FilterConfig arg0) throws ServletException {
  21. }
  22. }

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. <filter-mapping>
  10. <filter-name>cache-filter</filter-name>
  11. <url-pattern>*.js</url-pattern>
  12. </filter-mapping>
  13. <filter-mapping>
  14. <filter-name>cache-filter</filter-name>
  15. <url-pattern>*.css</url-pattern>
  16. </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>

在浏览器内输入httpTest.jsp,则抓取的请求/响应信息如下:

Java代码  
  1. http://localhost:8088/itims/widget/jquery/jquery-1.3.2.min.js
  2. GET /itims/widget/jquery/jquery-1.3.2.min.js HTTP/1.1
  3. Host: localhost:8088
  4. User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0
  5. Accept: */*
  6. Accept-Language: zh-cn,zh;q=0.5
  7. Accept-Encoding: gzip, deflate
  8. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
  9. Connection: keep-alive
  10. Referer: http://localhost:8088/itims/springTest.jsp
  11. Cookie: JSESSIONID=4B83B20F13BBCD37D1C0FB406807FA75
  12. If-Modified-Since: Sun, 28 Aug 2011 13:06:44 GMT
  13. If-None-Match: W/"57254-1314536804640"
  14. HTTP/1.1 304 Not Modified
  15. Server: Apache-Coyote/1.1
  16. Etag: W/"57254-1314536804640"
  17. Cache-Control: max-age=30
  18. 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的设置。

转载于:https://www.cnblogs.com/panxuejun/p/5842069.html

http304状态码缓存设置问题相关推荐

  1. http常见状态码及设置方法

    Http状态码 代码 消息 描述 100 Continue 只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求. 101 Switching Protocols 服务器切换协议. ...

  2. Nginx的代理缓存设置

    Nginx的代理缓存设置 语雀Q群 763215167 expires: 设置浏览器的缓存时间 (客户端缓存) location /files {alias /home/imooc;# expires ...

  3. 实现免密登录,设置只允许student1, student2用户登录,get和post的区别,HTTP状态码,HTTP请求报文和响应报文,HTTP是如何保持连接状态的

    1.实现免密登录 1创建密钥 [root@192 /]# su gzw [gzw@192 /]$ cd /home/gzw/.ssh [gzw@192 .ssh]$ ssh-keygen -t rsa ...

  4. 304状态码详解(协商缓存)

    304状态码详解(协商缓存) 上一篇文章针对不同的状态码做了一个整理,还说到要专门针对304做一个详解,于是与,今晚又来学习了. 首先说一下背景: 我们知道前端代码打包后需要部署到静态服务器上.客户端 ...

  5. 理解HTTP缓存和304状态码

    最近研究nginx日志的时候,对于304这个状态码产生了好奇.之前一直知道3XX系列的状态码表示重定向,但对于304的具体原理没有仔细研究过. 304 的标准解释是:客户端有缓冲的文档并发出了一个条件 ...

  6. http状态码304缓存机制(强缓存和协商缓存-304)

    前言:好久没写博客了,今天早上闲着没事重新看了下http的304缓存机制.下面我就简单的讲下我的理解吧. 描述:首先我们先明白一点什么是状态码.对于我们开发来说,大家一说起http状态码,都能随口说几 ...

  7. 协商缓存与状态码304

    协商缓存与状态码304 304 有时候我们访问某些网站会发现在控制台中,网络状态码返回的是304.(更多状态码相关-http必备知识点:http请求与js及状态码) 304(Not Modified) ...

  8. HTTP 状态码 304 缓存机制

    HTTP 状态码 304 缓存机制 交互流程 客户端第一次请求服务端的某个地址时,服务端会在响应时携带 ETag 与 Last-Modified 响应头,客户端下次再发送同一地址的请求时,会携带 If ...

  9. python flask 设置个性化的响应体 响应头 状态码

    目录 需求场景 使用return直接设置特定的响应信息 使用make_response设置特定的响应信息 需求场景 在api设计中,基于restful的设计原则,一个http的响应应该包含执行的响应信 ...

最新文章

  1. c语言图形界面设定,「分享」C语言如何编写图形界面
  2. shell test应用
  3. kafka--storm--mongodb
  4. centos7.x 64位 rpm安装JDK8
  5. 彻底明白TCP的三次握手与四次挥手的两张动图
  6. sqlserver中创建包含事务的存储过程
  7. Leetcode每日一题:925.Long Pressed Name(长按键入)
  8. MP4Box切割mp4视频文件
  9. 大数据产品推荐:金蜂巢大数据集成与脱敏系统
  10. js监听移动端手机横竖屏事件
  11. 注册表被禁用 (备用)
  12. 计算机桌面文字重影,为什么电脑屏幕上的字老是重影,该怎么调?
  13. 麻省理工十亿美元计算机学院,麻省理工学院10亿美元打造全新计算机科学学院,让所有学科的研究人员都能接触到最新的计算科学...
  14. 元宇宙:不透明面纱下的“康德主义”
  15. 基于XQ6657Z35-EVM开发平台上TI TMS320C6657 TLV320AIC3206音频设计
  16. springboot驾校报名系统 微信小程序
  17. java8获取本周本月第一天和最后一天
  18. 解决chrome您的连接不是私密连接
  19. Spring中的Ioc、DI到底是啥
  20. 微信公众号开发教程(一)

热门文章

  1. Synchronized和Lock区别
  2. java8 supplier 接口
  3. RocketMQ带你快速入门
  4. Java技术:Mybatis-plus常用API全套教程,值得收藏!
  5. 计算机系统基础:设备管理采用的相关技术知识笔记
  6. 无线网络:家庭 WiFi 的安全隐患及实用的防范建议
  7. android 引入 .so,android studio引入so库方法(示例代码)
  8. mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php
  9. 数据库---查询(详细)
  10. 根据图片获得配色方案_配色系列(1)—从图片中获得配色灵感