(JavaEE-03)HTTP协议

#http协议 什么是http协议?客户端连上web服务器后,若是想获取web服务器中的某个web资源,就须要遵照必定的通信格式,http协议就是用于定义客户端与服务器之间的通信格式。html

  • http是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程。
  • 深刻学习http协议是学好web开发的一个重要前提!
  • http协议的版本:http/1.0、http/1.1

(使用telnet演示,ctrl+],让回显正常显示)web

###http1.0与http1.1apache

在http1.0协议中,客户端与服务器创建链接后,只能获取一个web资源。 http1.1协议,容许客户端与web服务器创建链接后,在一个链接上获取多个资源。(使用telnet演示) 若是页面上有对别的web资源的引用,那么客户端会屡次请求服务器,例如,有三张图片,那么就会一共请求四次(CSS精灵,优化程序)。浏览器

#http请求 客户端连上服务器以后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。一个完整的http请求包括:缓存

  • 一个请求行
  • 若干消息头
  • 实体内容

GET /aaa/1.html HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-us,zh-cn;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Connection: keep-alive If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT If-None-Match: W/"268-1402702067708" Cache-Control: max-age=0tomcat

请求行:用于描述客户端的请求方式、请求资源的名称,以及使用HTTP协议版本号 消息头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等 实体内容:在此次请求中所携带的数据(消息头与实体内容中有一个空行)安全

###请求行 请求行中的GET称为请求方式,请求方式有:服务器

  • POST、GET、HEAD、OPTIONS、DELETE、PUT
  • 经常使用的有:GET、POST
  • 用户若是没有设置,默认状况下浏览器向服务器发送的都是get请求。(直接在地址栏输入地址访问,点击超连接访问,表单访问)

POST和GET,都用于向服务器请求某个资源,这两种方式的区别主要表如今数据传递上:app

  • 若是请求方式是GET,那么能够在请求的URL地址后面以 ? 的形式带上交给服务器的数据,多个数据之间用 & 分隔(GET /aaa/1.html?name=jack&pwd=123)
  • GET方式这种附带参数是有限制的,其数据容量不能超过1K(不安全)
  • 若是使用POST请求,则能够在请求的实体内容中(负载)向服务器发送数据,并且数量不限(安全)

###消息头 经常使用的消息头:jsp

  • Accept : text/html,image/* 告诉服务器,客户端所支持的类型
  • Accept-Charset : ISO=8859-1 客户端采用的编码表
  • Accept-Encoding : gzip,compress 客户端所支持的数据压缩格式
  • Accept-Language : en-us,zh-cn 客户端的语言环境(国际化)
  • Host : www.xinsiku.com:80 客户端想访问的主机
  • If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT 客户端对于资源的最后缓存时间
  • Referer : http://www.xinsiku.com/index.jsp 告知服务端,客户端是从哪一个页面去访问服务器的(防盗链)
  • User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 客户端的机器环境(使用的操做系统,浏览器,版本号等)
  • Cookie 给服务器带一些数据
  • Connection: close/keep-alive 告诉服务器,请求完以后,是保存链接仍是关闭链接
  • Date : Fri, 13 Jun 2014 23:27:47 GMT 请求时间值

#http响应 一个http响应表明服务器向客户端返回的数据,它包括:

  • 一个状态行,用于描述服务器对请求的处理结果
  • 若干消息头,消息头用于描述服务器的基本信息,以及数据的描述,服务器经过这些数据的描述信息,能够通知客户端如何处理等一会返回的数据
  • 以及实体内容,服务器向客户端返回的数据(实体内容与消息头中间有一个空行)

HTTP/1.1 200 OK (304 Not Modified)
Server : Apache-Coyote/1.1 Etag : W/"268-1402702066000" Date : Sat, 14 Jun 2014 03:45:49 GMT Accept-Ranges : bytes Content-Length : 268 Content-Type : text/html Date : Sat, 14 Jun 2014 03:47:34 GMT Etag : W/"268-1402702066000" Last-Modified : Fri, 13 Jun 2014 23:27:46 GMT Server : Apache-Coyote/1.1

###状态行 格式:HTTP版本号 状态码 缘由叙述<CRLF> 举例:HTTP/1.1 200 OK 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类:

100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程(不多见) 200~299 表示成功接收请求并已完成整个处理过程,经常使用200 300~399 为完成请求,客户须要进一步细化请求。例如:请求的资源已经移动一个新地址,经常使用302(让请求去找别的资源)、307和304(让客户端去拿缓存) 400~499 客户端请求有错误,经常使用 404 500~599 服务器端出现错误,经常使用500

###响应头 http响应经常使用响应头:

  • Location: http://xinsiku/index.jsp 这个头一般和302一块儿使用,告诉客户端去找别的资源 (demo)
  • Server: apache tomcat 告诉浏览器服务器的类型
  • Content-Encoding: gzip 告诉浏览器数据的压缩格式(gzip,减小流量,提高性能)(demo)
  • Content-Length: 80 告诉浏览器返回数据的长度
  • Content-Language: zh-cn 语言环境
  • Content-Type: text/html; charset=GB2312 返回数据的类型和编码 (demo)
  • Last-Modified: Fri, 13 Jun 2014 23:27:46 GMT 数据的最后修改时间(跟缓存相关)
  • Refresh: 1;url=http://www.xinsiku.com 多长时间定时刷新(服务器经过这个头来控制浏览器行为)(demo)
  • Content-Disposition: attachment; filename=aaa.zip 用下载的方式打开返回的数据(提示用户下载)(demo)
  • Transfer-Encoding: chunked 告诉浏览器,数据是以块的方式传输的
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search 控制Cookie与Session相关(后面有专题讲)
  • ETag: W/"7777-1242234904000" 给网页生成一个编号(作缓存用,单位能够到毫秒级别,Modified相关的只能到秒级别,高性能网站才须要相关开发)
  • Expires: -1 作缓存相关设置(-1或0 不要缓存,也能够设置缓存时间,如:2014 08 09,该设置是基于这次返回数据的,对别的资源没有效果)
  • Cache-Control: no-cache 设置缓存
  • Pragma: no-cache 设置缓存(针对不一样的浏览器开发商,对缓存的设置,这三个设置一块儿用)
  • Connection: close/Keep-Alive
  • Date: Fri, 13 Jun 2014 23:27:46 GMT

在实际开发中,咱们是不须要编写这些复杂的头信息的,由于在JavaEE中已经封装了不少针对不一样请求和响应的处理对象,直接调用相对应的API就能够了,可是只要清楚了响应头,咱们也能够本身去编写一些响应程序,并且对于响应对象的理解也更加容易。

###Range头(断点续传)(demo)

  • HTTP请求头字段

Range头指示服务器只传输一部分web资源。这个头能够用来实现断点续传功能。Renge字段能够经过三种格式设置传输的字节范围:

Range : bytes=1000-200 (传输范围从1000到2000字节) Range : bytes=1000- (从1000个字节之后的全部内容) Range : bytes=1000 (传输最后1000个字节)

  • HTTP响应消息头字段

Accept-Ranges: 表示知否支持Renge,若是支持,返回:Accept-Ranges: bytes,若是不支持,返回:Accept-Ranges: none Content-Range : 返回的Web资源的字节范围,如:Content-Range : 1000-3000/5000(表示本次返回资源的1000到3000字节的数据,总共5000字节)

相关文章
相关标签/搜索