HTTP报文

HTTP请求报文

1.组成部分

HTTP请求报文有3部分组成,请求头+请求行+请求体。

image

  1. 请求方法。HTTP的请求方法常用的有GET/POST,除此之外还有DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST。Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。
  2. 请求URL:跟HOST组成完整的请求URL。
  3. HTTP协议:协议名称和版本号。
  4. HTTP报文头:有属性:属性值,服务端可以获取客户端信息。
  5. HTTP报文体:它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。

2.HTTP请求报文头属性

Accept
请求报文通过Accept报文属性头告诉服务端,客户端接受什么类型的相应。
Accpet:text/plain表示只接受纯文本数据
Accept属性的值可以为一个或多个MIME类型的值,关于MIME类型,大家请参考:http://en.wikipedia.org/wiki/MIME_type

Cookie
客户端的Cookie就是通过这个报文头属性传给服务端
URL重写功能,为了防止一些用户把Cookie禁止而无法使用session而设置的功能.jsessionid后面的一长串就是你服务器上的session的ID号,这样无需cookie也可以使用session

Referer
表示这个请求是从哪个URL过来的

Cache-Control
对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。
如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存(当然响应报文也是通过响应报文头通知浏览器客户端的,这个下面再说):
Cache-Control: no-cache

如何访问请求报文头

请求头是客户端发送过来的,服务端就只能读取了,常用的是HttpServletRequest中的API读取。

//获取请求报文中的属性名称  
java.util.Enumeration   getHeaderNames();  
  
//获取指定名称的报文头属性的值  
java.lang.String getHeader(java.lang.String name)   

//获取报文头中的Cookie(读取Cookie的报文头属性)  
 Cookie[]   getCookies() ;  
  
//获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
java.util.Locale    getLocale()   
  
//获取请求报文体的长度(读取Content-Length的报文头属性)  
int getContentLength();   

HttpServletRequest可以通过

 HttpSession getSession()

获取请求所关联的HttpSession,
其内部的机理是通过读取请求报文头中Cookie属性的JSESSIONID的值,在服务端的一个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。

HTTP响应报文

image

响应报文也是有响应头+响应体+响应行组成
和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。
HTTP的响应状态码由5段组成:

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

303 See Other
我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。
304 Not Modified
告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧

//设置状态码,状态码在HttpServletResponse中通过一系列的常量预定义了,如SC_ACCEPTED,SC_OK
void    setStatus(int sc) 

常见的HTTP响应报文头属性

Cache-Control
响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取。
Cache-Control: max-age=3600 设置缓存时间6分钟

ETag
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b" 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。

Location
当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转。
但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。

Set-Cookie
服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的

/添加一个响应报文头属性
void    setHeader(String name, String value) 

//添加Cookie报文头属性
void addCookie(Cookie cookie) 

//不但会设置Location的响应报文头,还会生成303的状态码
void    sendRedirect(String location) 

你可能感兴趣的:(HTTP报文)