精华内容
下载资源
问答
  • 浏览器HTTP协议请求信息

    万次阅读 多人点赞 2018-06-22 17:54:19
    客户端向服务器发送一个请求,请求包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码...
     通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
    

    blob.png 看懂谷歌浏览器HTTP协议请求头信息 其他

    Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET、POST、PUT、DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET、POST、PUT、 DELETE就对应着对这个资源的查、改、增、删4个操作,我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

    一、HTTP头信息解读

      HTTP的头域包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。

      通用头部:是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部。

      请求头部:是请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部。

      响应头部:便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部。

      实体头部:指的是用于应对实体主体部分的头部,比如,可以用实体头部来说明实体主体部分的数据类型,如Content-Type头部。

         1、HTTP通用头

      通用头域包含请求和响应消息都支持的头域,通用头域包含缓存头部Cache-Control、Pragma及信息性头部Connection、Date、Transfer-Encoding、Update、Via。

      1、Cache-Control

      Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

      no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。 

      no-store:缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。

      max-age:缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。

      min-fresh:至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。

      max-stale:指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。

      only-if-cached:只有当缓存中有副本存在时,客户端才会获得一份副本。

      Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。

      Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。

      2、Pragma

      Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。

      3、Connection

      Connection表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

      Close:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了。

      Keepalive:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。

      Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒),如Keep-Alive:300。

      4、Date

      Date头域表示消息发送的时间,服务器响应中要包含这个头部,因为缓存在评估响应的新鲜度时要用到,其时间的描述格式由RFC822定义。例如,Date:Mon, 31 Dec 2001 04:25:57 GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

      5、Transfer-Encoding

      WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked),例如:Transfer-Encoding: chunked

      6、Upgrade

      它可以指定另一种可能完全不同的协议,如HTTP/1.1客户端可以向服务器发送一条HTTP/1.0请求,其中包含值为“HTTP/1.1”的Update头部,这样客户端就可以测试一下服务器是否也使用HTTP/1.1了。

      7、Via

      列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。

      当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)

         2、HTTP请求头

      请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

      8、Accept

      告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

      9、Accept-Charset

      浏览器告诉服务器自己能接收的字符集。

      10、Accept-Encoding

      浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。

      11、Accept-Language

      浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

      12、Authorization

      当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。

      13、If-Match

      如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,获取文档。

      14、If-None-Match

      如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作,获取文档。

      15、If-Modified-Since

      如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

      16、If-Unmodified-Since

      如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

      17、If-Range

      浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

      18、Range

      浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546

      19、Proxy-Authenticate

      代理服务器响应浏览器,要求其提供代理身份验证信息。

      20、Proxy-Authorization

      浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

      21、Host

      客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。如Host:rss.sina.com.cn

      22、Referer

      浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL,例如:Referer:http://www.ecdoer.com/

      23、User-Agent

      浏览器表明自己的身份(是哪种浏览器)。例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN;rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

      3、HTTP响应头

      响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些头部有助于客户端处理响应,并在将来发起更好的请求。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

      24、Age

      当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

      25、Server

      WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)

      26、Accept-Ranges

      WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。

      27、Vary

      WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding: gzip; Vary: Content-Encoding,那么Cache服务器会分析后续请求消息的头部,检查其Accept-Encoding,是否跟先前响应的Vary头部值一致,即是否使用相同的内容编码方法,这样就可以防止Cache服务器用自己Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding。

         4、HTTP实体头

      实体头部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。总之,实体头部可以告知接收者它在对什么进行处理。请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括信息性头部Allow、Location,内容头部Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type,缓存头部Etag、Expires、Last-Modified、extension-header。

      28、Allow

      服务器支持哪些请求方法(如GET、POST等)。

      29、Location

      表示客户应当到哪里去提取文档,用于将接收端定位到资源的位置(URL)上。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

      30、Content-Base

      解析主体中的相对URL时使用的基础URL。

      31、Content-Encoding

      WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip

      32、Content-Language

      WEB 服务器告诉浏览器理解主体时最适宜使用的自然语言。

      33、Content-Length

      WEB服务器告诉浏览器自己响应的对象的长度或尺寸,例如:Content-Length: 26012

      34、Content-Location

      资源实际所处的位置。

      35、Content-MD5

      主体的MD5校验和。

      36、Content-Range

      实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth。例如,传送头500个字节次字段的形式:Content-Range:bytes0- 499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

      37、Content-Type

      WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml

      38、Etag

      就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。

      39、Expires

      WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT

      40、Last-Modified

      WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

    二、HTTP Request的Header信息

     1、HTTP请求方式

    说明:主要使用到“GET”和“POST”。

      实例: POST /test/tupian/cm HTTP/1.1

      分成三部分:

      (1)POST:HTTP请求方式

      (2)/test/tupian/cm:请求Web服务器的目录地址(或者指令)

      (3)HTTP/1.1: URI(Uniform Resource Identifier,统一资源标识符)及其版本

      备注:在Ajax中,对应method属性设置。

      2、Host

      说明:请求的web服务器域名地址

      3、User-Agent

      说明:HTTP客户端运行的浏览器类型的详细信息。通过该头部信息,web服务器可以判断到当前HTTP请求的客户端浏览器类别。

      实例:User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

      4、Accept

      说明:指定客户端能够接收的内容类型,内容类型中的先后次序表示客户端接收的先后次序。

      实例:Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

      备注:在Prototyp(1.5)的Ajax代码封装中,将Accept默认设置为“text/javascript, text/html, application/xml, text/xml, */*”。这是因为Ajax默认获取服务器返回的Json数据模式。在Ajax代码中,可以使用XMLHttpRequest 对象中setRequestHeader函数方法来动态设置这些Header信息。

      5、Accept-Language

      说明:指定HTTP客户端浏览器用来展示返回信息所优先选择的语言。

      实例:Accept-Language: zh-cn,zh;q=0.5 这里默认为中文。

      6、Accept-Encoding

      说明:指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。而这里设置的就是客户端浏览器所能够支持的返回压缩格式。

      实例:Accept-Encoding: gzip,deflate

      备注:其实在百度很多产品线中,apache在给客户端返回页面数据之前,将数据以gzip格式进行压缩。

      7、Accept-Charset

      说明:浏览器可以接受的字符编码集。

      实例:Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

      8、Content-Type

      说明:显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。

      实例:Content-type: application/x-www-form-urlencoded;charset:UTF-8

      备注:有关Content-Type属性值可以如下两种编码类型:

      (1)“application/x-www-form-urlencoded”: 表单数据向服务器提交时所采用的编码类型,默认的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。

      (2)“multipart/form-data”: 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。

      当提交为单单数据时,可以使用“application/x-www-form-urlencoded”;当提交的是文件时,就需要使用“multipart/form-data”编码类型。

      在Content-Type属性当中还是指定提交内容的charset字符编码。一般不进行设置,它只是告诉web服务器post提交的数据采用的何种字符编码。

      一般在开发过程,是由前端工程与后端UI工程师商量好使用什么字符编码格式来post提交的,然后后端ui工程师按照固定的字符编码来解析提交的数据。所以这里设置的charset没有多大作用。

      9、Connection

      说明:表示是否需要持久连接。如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。

      实例:Connection: keep-alive

      10、Keep-Alive

      说明:显示此HTTP连接的Keep-Alive时间。使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。以前HTTP请求是一站式连接,从HTTP/1.1协议之后,就有了长连接,即在规定的Keep-Alive时间内,连接是不会断开的。

      实例:Keep-Alive: 300

      11、cookie

      说明:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。

      12、Referer

      说明:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面

            13、HTTP Response的Header信息

    Header解释示例
    Accept-Ranges表明服务器是否支持指定范围请求及哪种类型的分段请求Accept-Ranges: bytes
    Age从原始服务器到代理缓存形成的估算时间(以秒计,非负)Age: 12
    Allow对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEAD
    Cache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-cache
    Content-Encodingweb服务器支持的返回内容压缩编码类型。Content-Encoding: gzip
    Content-Language响应体的语言Content-Language: en,zh
    Content-Length响应体的长度Content-Length: 348
    Content-Location请求资源可替代的备用的另一地址Content-Location: /index.htm
    Content-MD5返回资源的MD5校验值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
    Content-Range在整个返回体中本部分的字节位置Content-Range: bytes 21010-47021/47022
    Content-Type返回内容的MIME类型Content-Type: text/html; charset=utf-8
    Date原始服务器消息发出的时间Date: Tue, 15 Nov 2010 08:12:31 GMT
    ETag请求变量的实体标签的当前值ETag: “737060cd8c284d8af7ad3082f209582d”
    Expires响应过期的日期和时间Expires: Thu, 01 Dec 2010 16:00:00 GMT
    Last-Modified请求资源的最后修改时间Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
    Location用来重定向接收方到非请求URL的位置来完成请求或标识新的资源Location: http://www.zcmhi.com/archives/94.html
    Pragma包括实现特定的指令,它可应用到响应链上的任何接收方Pragma: no-cache
    Proxy-Authenticate它指出认证方案和可应用到代理的该URL上的参数Proxy-Authenticate: Basic
    refresh应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
    Refresh: 5; url=
    http://www.zcmhi.com/archives/94.html
    Retry-After如果实体暂时不可取,通知客户端在指定时间之后再次尝试Retry-After: 120
    Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
    Set-Cookie设置Http CookieSet-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
    Trailer指出头域在分块传输编码的尾部存在Trailer: Max-Forwards
    Transfer-Encoding文件传输编码Transfer-Encoding:chunked
    Vary告诉下游代理是使用缓存响应还是从原始服务器请求Vary: *
    Via告知代理客户端响应是通过哪里发送的Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning警告实体可能存在的问题Warning: 199 Miscellaneous warning
    WWW-Authenticate表明客户端请求实体应该使用的授权方案WWW-Authenticate: Basic

            14、http返回错误码

      HTTP响应码响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示:

      1xx:信息,请求收到,继续处理

      2xx:成功,行为被成功地接受、理解和采纳

      3xx:重定向,为了完成请求,必须进一步执行的动作

      4xx:客户端错误,请求包含语法错误或者请求无法实现

      5xx:服务器错误,服务器不能实现一种明显无效的请求

      下表显示每个响应码及其含义:

    100 继续 101 分组交换协200 OK201 被创建 202 被采纳
    203 非授权信息 204 无内容205 重置内容206 部分内容300 多选项
    301 永久地传送302 找到 303 参见其他304 未改动 305 使用代理
    307 暂时重定向400 错误请求401 未授权402 要求付费403 禁止
    404 未找到405 不允许的方法406 不被采纳407 要求代理授权408 请求超时
    409 冲突410 过期的411 要求的长度412 前提不成立413 请求实例太大
    414 请求URI太大 415 不支持的媒体类型416 无法满足的请求范围417 失败的预期500 内部服务器错误
    501 未被使用502 网关错误503 不可用的服务504 网关超时505 HTTP版本未被支持




    展开全文
  • 案例,获取浏览器的类型 package gz.itcast.b_request; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet....

    package zdh.cm.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 判断浏览器类型
     * @author Administrator
     *
     */
    public class Demo1 extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//防止浏览器乱码,
    		response.setContentType("text/html;character=utf-8");
    		//获取浏览器信息
    		String info = request.getHeader("User-agent");
    		System.out.println(info);
    		//判断浏览器是否是Chrome浏览器
    		if(info.contains("Chrome"))
    		{
    			//两种将字符串输出的方式,但是两种方式不可以同时使用,因为write只能被一个对象使用。
    			//response.getWriter().write("welcome use Chrome");
    			response.getOutputStream().write("这是第二句话".getBytes());
    		}else{
    			response.getWriter().write("sorry,I dont no it!!");
    		}
    	}
    }
    


    展开全文
  • java获取浏览器代理设置需要
  • 获取浏览器的地址

    千次阅读 2019-03-07 16:49:58
    1.获取http协议:window.location.protocol 2.获取一个页面的主机名和端口号相当于是hostname和port:window.location.host 所以浏览器的地址是window.location.protocol+'//'+window.location.host ...

    1.获取http协议:window.location.protocol

    2.获取一个页面的主机名和端口号相当于是hostname和port:window.location.host

    所以浏览器的地址是window.location.protocol+'//'+window.location.host

     

    展开全文
  • 浏览器 HTTP 协议缓存机制详解

    千次阅读 2016-07-13 17:24:40
    有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形 Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag...

    最近在看有关于Android网络请求框架,在阅读OkHttp源代码的时候遇到缓存有关的问题。自己以前也看过有关文章但看完之后都没有太深的影响,今天发现一片很不错的文章记录下来。


    转自:http://my.oschina.net/leejun2005/blog/369148


    1、缓存的分类

    缓存分为服务端侧(server side,比如 Nginx、Apache)和客户端侧(client side,比如 web browser)。

    服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理、Squid等),其实广泛使用的 CDN 也是一种服务端缓存,目的都是让用户的请求走”捷径“,并且都是缓存图片、文件等静态资源。

    客户端侧缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问,想想现在的大型网站,随便一个页面都是一两百个请求,每天 pv 都是亿级别,如果没有缓存,用户体验会急剧下降、同时服务器压力和网络带宽都面临严重的考验。


    2、浏览器缓存机制详解


    浏览器缓存控制机制有两种:HTML Meta标签 vs. HTTP头信息


    2.1 HTML Meta标签控制缓存


    浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires; Cache-control等)。但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">

    上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。而广泛应用的还是 HTTP头信息 来控制缓存,下面我主要介绍HTTP协议定义的缓存机制。


    2.2 HTTP头信息控制缓存


    2.2.1 浏览器请求流程


    • 浏览器第一次请求流程图:

    • 浏览器再次请求时:



    2.2.2 几个重要概念解释


    • Expires策略Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

    • Cache-control策略(重点关注)Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。

    • 值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
      各个消息中的指令含义如下:
      Public指示响应可被任何缓存区缓存。
      Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
      no-cache指示请求或响应消息不能缓存,该选项并不是说可以设置”不缓存“,容易望文生义~
      no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存,完全不存下來。
      max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
      min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
      max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。


    • Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。

    • Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
      If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。

    • Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用。

    • Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
      If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。

    • 既生Last-Modified何生Etag?你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

    • Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
      如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
      有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

    Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag一起使用时,服务器会优先验证ETag。

    • yahoo的Yslow法则中则提示谨慎设置Etag需要注意的是分布式系统里多台机器间文件的last-modified必须保持一致,以免负载均衡到不同机器导致比对失败,Yahoo建议分布式系统尽量关闭掉Etag(每台机器生成的etag都会不一样,因为除了 last-modified、inode 也很难保持一致)。

    • Pragma行是为了兼容HTTP1.0,作用与Cache-Control: no-cache是一样的。

    • 最后总结下几种状态码的区别



    3、用户行为与缓存


    浏览器缓存行为还有用户的行为有关,如果大家对 强制刷新(Ctrl + F5) 还有印象的话应该能立刻明白我的意思~

    用户操作

    Expires/Cache-Control

    Last-Modified/Etag

    地址栏回车

    有效

    有效

    页面链接跳转

    有效

    有效

    新开窗口

    有效

    有效

    前进、后退

    有效

    有效

    F5/按钮刷新

    无效(BR重置max-age=0)

    有效

    Ctrl+F5刷新

    无效(重置CC=no-cache)

    无效(请求头丢弃该选项)

    具体请参考文末 Refer [6]


    4、Refer:


    [1] 浏览器缓存机制

    http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html

    [2] Web 开发人员需知的 Web 缓存知识

    http://www.oschina.net/news/41397/web-cache-knowledge

    [3] 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

    http://blog.csdn.net/eroswang/article/details/8302191

    [4] 在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别

    http://cloudbbs.org/forum.php?mod=viewthread&tid=15790

    http://blog.csdn.net/yui/article/details/6584401

    [5] Cache Control 與 ETag

    https://blog.othree.net/log/2012/12/22/cache-control-and-etag/

    [6] 缓存的故事

    http://segmentfault.com/blog/animabear/1190000000375344

    [7] Google的PageSpeed网站优化理论中提到使用Etag可以减少服务器负担

    https://developers.google.com/speed/docs/pss/AddEtags

    [8] yahoo的Yslow法则中则提示谨慎设置Etag

    http://developer.yahoo.com/performance/rules.html#etags

    [9] H5 缓存机制浅析 移动端 Web 加载性能优化

    http://segmentfault.com/a/1190000004132566

    [10] 网页性能: 缓存效率实践

    http://www.w3ctech.com/topic/1648

    [11] 透过浏览器看HTTP缓存

    http://www.cnblogs.com/skylar/p/browser-http-caching.html

    [12] 浏览器缓存知识小结及应用

    http://web.jobbole.com/84888/

    [13] 大公司里怎样开发和部署前端代码?

    http://zhihu.com/question/20790576/answer/32602154?utm_campaign=webshare&utm_source=weibo&utm_medium=zhihu

    [14] 浏览器缓存机制详解

    https://mangguo.org/browser-cache-mechanism-detailed/

    展开全文
  • 一、认识HTTP HTTP协议历史及设计思路(点击浏览)二、获取浏览器HTTP请求header信息 1. Apach服务器下可以直接使用 PHP自带函数获取客户端HTTP请求信息/* 作用:获取客户端HTTP请求所有信息(header) 参数...
  • Servlet--获取Http协议请求信息

    千次阅读 2017-07-18 18:51:57
    Servlet--获取Http协议请求信息 ...1、创建一个GetServlet类,继承HttpServlet通过doGet请求来获取协议请求信息。 package tests06_2; import java.io.IOException; import java.io.PrintWriter; import java.ut
  • js获取浏览器参数方法

    千次阅读 2017-12-14 13:54:06
    方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) {  var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");  var r ...
  • 探讨一个问题,我想写一个exe,功能就是实时的获取浏览器地址栏的网页地址,有没有什么好的想法,  之前许多人说通过findwindows来获取浏览器的句柄,然后发消息获取浏览器地址栏编辑框的内容,但是这样我觉得...
  • 获取浏览器的header信息

    千次阅读 2010-08-25 11:07:38
    String Agent = request.getHeader("User-Agent"); StringTokenizer st = new ...//得到用户的浏览器名 String userbrowser = st.nextToken(); //得到用户的操作系统名 String useros =...
  • 但是,我不想读官方的http文档,我想直接自己去一点点了解http协议,通过编写socket与浏览器通信。代码如下 import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import.....
  • Javascript获取浏览器地址栏url

    千次阅读 2019-09-18 19:06:44
    URL即:统一资源定位符 (Uniform Resource Locator, URL) 完整的URL由这几个部分构成: scheme://host:port/path?query#fragment...
  • 我们经常需要获取网页的url,此时就会用到如下: document.location.protocol //判断是 https: 还是http: document.location.hostname //获取是 localhost 还是192.168.100.118 还是www.baidu.com document....
  • 当请求由浏览器直接发起请求到服务器中间没有经过代理转发的话,则可以采用如下代码获取协议,域名等参数。如果经过了转发则只能由代理服务如HA或者nginx把域名和协议写在请求头里转发到后端服务,然后通过读取请求...
  • 如何通过HttpServletRequest来获取到上面的属性呢? 1、引入开源工具 <!-- https://mvnrepository.com/artifact/eu.bitwalker/UserAgentUtils --> <dependency> <groupId>eu.bitwalker<...
  • PHP获取客户端(浏览器)信息;PHP获取客户端系统信息;PHP获取服务器基本信息
  • request 获取浏览器所带参数

    千次阅读 2013-08-04 10:17:31
    2012年HTML5主题峰会 “生态 共融 多赢”主题峰会浏览器专场TV专场渠道与合作工具与应用 JSP 获取URL 附带参数 获取当前浏览器的URL: () + ":" + request.getServerPort() + request.getContextPath()+request....
  • 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形 yahoo的Yslow法则中则提示谨慎设置Etag : 需要注意的是 分布式系统里多台机器间文件的last-modified必须保持一致,以免...
  • 如题,可用document.referrer方法获取上一页面的url 但是也有不可使用的情况 直接在浏览器地址栏中输入地址; 使用location.reload()刷新(location.href或者location.replace()刷新有信息); 在微信对话框中...
  • WAP1.X/WAP2.0以及WAP浏览器协议版本

    万次阅读 2010-10-21 15:26:00
     WAP即无线应用协议,Wireless Application Protocol,主要有两个版本: WAP1.X:包括WAP1.0,WAP1.1和WAP1.2 WAP2.0  WAP1.X规定无线设备访问的页面是用WML(一种XML方言)语言编写的,但是WAP2.0将...
  • 浏览器缓存和HTTP协议

    千次阅读 2012-04-30 10:17:27
    http协议中与cache相关的header主要有这么几个: 1.Pragma:只能取固定值no-cache,用于http/1.0里面,禁止浏览器缓存 2. Expires:用于指定当前缓存的文档在什么时候被认为过期,GMT格式,超过了这个日期浏览器就...
  • 如何查看浏览器http请求协议

    千次阅读 2010-04-10 09:55:07
    Http(Hyper Text Transfer Protocal)是超文本传输协议,它用于网页间传送数据,http采用的是请求、响应模型,也就是说浏览器和Web服务器之间的交互(http事务)包括浏览器发起的一个请求和随后服务器返回的一个...
  • 在APP开发过程中,通过外部浏览器调起APP页面的场景也很普遍使用。下面就介绍一下通过外部H5页面唤起APP中页面的通用方法。1.首先需要在AndroidMainifest.xml中对你要启动的那个activity进行如下设置: activity ...
  • HTTP协议浏览器解析

    千次阅读 2018-04-13 12:02:44
    1. 使用谷歌/火狐浏览器分析在Web应用中,服务器把网页传给浏览器,实际上...HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信(现在HTTP协议不仅仅能够传输html、css、js,而且还能传输json、xml、图片等)。...
  • 第一次接触到web api,发现这个东西是REST风格的:---- 微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单...
  • 获取http协议请求行 getMethod();获取http协议的请求方法; getRequestURI();获取URI getRequestURL();获取URL getQueryString();获取http请求URL后面的查询字符串 getProtocol();获取http后面的协议号版本号 ...
  • Http协议下的浏览器与服务器的交互

    千次阅读 2015-11-28 21:12:24
    http是超文本传输协议的缩写,顾名思义,它是浏览器有服务器传输超文本时所要遵守的一套协议。通俗的讲,http协议是基于应用层的通信规范。所以,了解http协议对于web开发是尤为重要的。 一. 关于http的几个概念: ...
  • HTTP协议详解及Java模拟浏览器请求

    千次阅读 2018-09-19 18:07:10
    HTTP(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,HTTP协议规定了超文本传输所要遵守的规则。 HTTP是一个应用层协议,...
  • HTTP协议--浏览器的实现

    千次阅读 2016-10-08 21:39:22
    3.Web浏览器发送请求信息 4.Web服务器应答 5.Web服务器发送应答信息 6.Web服务器想浏览器发送数据 7.Web服务器关闭TCP连接 一个HTTP请求一般由四部分组成: 1.HTTP请求的方法或动作,...
  • HTTP协议浏览器编码行为

    万次阅读 2012-11-03 22:41:40
    6.1 HTTP协议浏览器编码行为 HTTP协议浏览器是Web国际化的基础,在进入Java服务器端之前,必须先对它们的编码行为有所了解。 6.1.1 HTTP协议 HTTP协议是B/S体系结构应用程序的基础,只有了解了HTTP协议,才能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,223
精华内容 108,089
关键字:

获取浏览器完整协议头