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&param2=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<java.lang.String>   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) 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本篇文章篇幅比较长,先来个思维导图预览一下。 一、概述 1.计算机网络体系结构分层 2.TCP/IP 通信传输流 ...
    涤生_Woo阅读 56,006评论 24 557
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,288评论 19 139
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 12,736评论 6 152
  • 花开会有期,何须碌碌为? 抬眼春意暖,俯首为功名。 心宽天自阔,情深不可留。 醉意山水间,不枉此生行。
    文若男阅读 1,877评论 0 6
  • 因为写教案耽误了上课的时间,匆匆忙忙的自信车在车流中踩过,耳边的风一下就将自己带到了2012年的暑期末,那段...
    宁子沫沫阅读 1,684评论 0 0

友情链接更多精彩内容