【刷题】面筋-网络-HTTP请求行、请求头、请求体详解

目录

HTTP请求报文解剖

  • HTTP请求报文由3部分组成(请求行+请求头+请求体):

  • 下面是一个实际的请求报文:

  • 请求报文的解析

    • ①是请求方法,GET和POST是最多见的HTTP方法,除此之外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,容许你经过“_method”的表单参数指定这些特殊的HTTP方法(实际上仍是经过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可使用这些HTTP方法对处理方法进行映射了。html

    • ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL,java

    • ③是协议名称及版本号。web

    • ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。spring

    • ⑤是报文体,它将一个页面表单中的组件值经过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体能够传递请求参数,请求URL也能够经过相似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。浏览器

  • 对照上面的请求报文,咱们把它进一步分解,你能够看到一幅更详细的结构图:

HTTP请求报文头属性

  • 请求HTTP报文和响应HTTP报文都拥有若干个报文头属性,它们是为协助客户端及服务端交易的一些附属信息

常见的HTTP请求报文头属性

  • Accept

    • 请求报文可经过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。
    • 以下报文头至关于告诉服务端,本客户端可以接受的响应类型仅为纯文本数据啊,发其它什么图片啊,视频啊,会歇菜的~~~:
Accept:text/plain`
  • Accept属性的值能够为一个或多个MIME类型的值,关于MIME类型,你们请参考:http://en.wikipedia.org/wiki/MIME_type缓存

    • 客户端的Cookie就是经过这个报文头属性传给服务端的哦!以下所示:
Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C`
  • 服务端是怎么知道客户端的多个请求是隶属于一个Session呢?服务器

    • 注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?
    • 原来就是经过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!
    • (固然也能够经过重写URL的方式将会话ID附带在每一个URL的后面哦)。
  • Referer

    • 表示这个请求是从哪一个URL过来的,假如你经过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。
    • 不少貌似神奇的网页监控软件(如著名的 我要啦),只要在你的网页上放上一段JavaScript,就能够帮你监控流量,全国访问客户的分布状况等报表和图表,其原理就是经过这个Referer及其它一些HTTP报文头工做的。
  • Cache-Control

    • 对缓存进行控制,如一个请求但愿响应返回的内容在客户端要被缓存一年,或不但愿被缓存就能够经过这个报文头达到目的。
    • 如如下设置,至关于让服务端将对应请求返回的响应内容不要在客户端缓存:
Cache-Control: no-cache

其它请求报文头属性

如何访问请求报文头

  • 因为请求报文头是客户端发过来的,服务端固然只能读取了,如下是HttpServletRequest一些用于读取请求报文头的API:
//获取请求报文中的属性名称  
java.util.Enumeration<java.lang.String>   getHeaderNames();  
  
//获取指定名称的报文头属性的值  
java.lang.String getHeader(java.lang.String name)
  • 因为一些请求报文头属性“太著名”了,所以HttpServletRequest为它们提供了VIP的API:
//获取报文头中的Cookie(读取Cookie的报文头属性)  
 Cookie[]   getCookies() ;  
  
//获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
java.util.Locale    getLocale()   
  
//获取请求报文体的长度(读取Content-Length的报文头属性)  
int getContentLength();
  • HttpServletRequest能够经过如下命令获取请求所关联的HttpSession,其内部的机理是经过读取请求报文头中Cookie属性的JSESSIONID的值,在服务端的一个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。(这样,你就不会以为HttpSession很神秘了吧)
    • HttpSession getSession()

=================================================cookie

HTTP响应报文解剖

  • HTTP的响应报文也由三部分组成(响应行+响应头+响应体):


=================================================session

响应状态码

  • 和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。

HTTP的响应状态码由5段组成:

1xx 消息,通常是告诉客户端,请求已经收到了,正在处理,别急...
2xx 处理成功,通常表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被受权,禁止访问等。
5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。多线程

  • 注:

    • 有些响应码,Web应用服务器会自动给生成。你能够经过HttpServletResponse的API设置状态码:
//设置状态码,状态码在HttpServletResponse中经过一系列的常量预约义了,如SC_ACCEPTED,SC_OK  
void    setStatus(int sc)

=================================================

常见的HTTP响应报文头属性

  • Cache-Control

    • 响应输出到客户端后,服务端经过该报文头属告诉客户端如何控制响应内容的缓存。
    • 下面,的设置让客户端对响应内容缓存3600秒,也即在3600秒内,若是客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取(固然,这个功能是靠客户端实现的,服务端只是经过这个属性提示客户端“应该这么作”,作不作,仍是决定于客户端,若是是本身宣称支持HTTP的客户端,则就应该这样实现)。
Java代码  收藏代码
Cache-Control: max-age=3600
  • ETag

    • 一个表明响应服务端资源(如页面)版本的报文头属性,若是某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可让客户端“更智能”地处理何时要从服务端取资源,何时能够直接从缓存中返回响应。
    • 关于ETag的说明,你能够参见:http://en.wikipedia.org/wiki/HTTP_ETag。
    • Spring 3.0还专门为此提供了一个org.springframework.web.filter.ShallowEtagHeaderFilter(实现原理很简单,对JSP输出的内容MD5,这样内容有变化ETag就相应变化了),用于生成响应的ETag,由于这东东确实能够帮助减小请求和响应的交互。

下面是一个ETag:

ETag: "737060cd8c284d8af7ad3082f209582d"
  • Location

    • 咱们在JSP中让页面Redirect到一个某个A页面中,实际上是让客户端再发一个请求到A页面,这个须要Redirect到的A页面的URL,其实就是经过响应报文头的Location属性告知客户端的,以下的报文头属性,将使客户端redirect到iteye的首页中:
Location: http://www.iteye.com
    • 服务端能够设置客户端的Cookie,其原理就是经过这个响应报文头属性实现的:
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

如何写HTTP请求报文头

  • 在服务端能够经过HttpServletResponse的API写响应报文头的属性:
//添加一个响应报文头属性  
void    setHeader(String name, String value)
  • 象Cookie,Location这些响应都是有福之人,HttpServletResponse为它们都提供了VIP版的API:
//添加Cookie报文头属性  
void addCookie(Cookie cookie)   
  
//不但会设置Location的响应报文头,还会生成303的状态码呢,二者天仙配呢  
void    sendRedirect(String location)

=================================================

HTTP请求头--那些你须要记住的基础知识

HTTP头信息解读

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

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

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

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

  实体头部:指的是用于应对实体主体部分的头部,好比,能够用实体头部来讲明实体主体部分的数据类型,如Content-Type头部。

HTTP通用头

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

  一、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:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。

  二、Pragma

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

  三、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。

  四、Date

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

  五、Transfer-Encoding

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

  六、Upgrade

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

  七、Via

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

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

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。对请求头域的扩展要求通信双方都支持,若是存在不支持的请求头域,通常将会做为实体头域处理。

  八、Accept

  告诉WEB服务器本身接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的全部子类型,type/sub-type。

  九、Accept-Charset

  浏览器告诉服务器本身能接收的字符集。

  十、Accept-Encoding

  浏览器申明本身接收的编码方法,一般指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。

  十一、Accept-Language

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

  十二、Authorization

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

  1三、If-Match

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

  1四、If-None-Match

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

  1五、If-Modified-Since

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

  1六、If-Unmodified-Since

  若是请求的对象在该头部指定的时间以后没修改过,才执行请求的动做(好比返回对象)。

  1七、If-Range

  浏览器告诉 WEB 服务器,若是我请求的对象没有改变,就把我缺乏的部分给我,若是对象改变了,就把整个对象给我。浏览器经过发送请求对象的ETag 或者本身所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。老是跟 Range 头部一块儿使用。

  1八、Range

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

  1九、Proxy-Authenticate

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

  20、Proxy-Authorization

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

  2一、Host

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

  2二、Referer

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

  2三、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

HTTP响应头

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

  2四、Age

  当代理服务器用本身缓存的实体去响应请求时,用该头部代表该实体从产生到如今通过多长时间了。

  2五、Server

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

  2六、Accept-Ranges

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

  2七、Vary

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

HTTP实体头

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

  2八、Allow

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

  2九、Location

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

  30、Content-Base

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

  3一、Content-Encoding

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

  3二、Content-Language

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

  3三、Content-Length

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

  3四、Content-Location

  资源实际所处的位置。

  3五、Content-MD5

  主体的MD5校验和。

  3六、Content-Range

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

  3七、Content-Type

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

  3八、Etag

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

  3九、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

参考连接

END

相关文章
相关标签/搜索