文档章节

(JavaEE-03)HTTP协议

_-Leon-_
 _-Leon-_
发布于 2014/06/14 17:12
字数 2012
阅读 275
收藏 14

#http协议 什么是http协议?客户端连上web服务器后,如果想获取web服务器中的某个web资源,就需要遵守一定的通讯格式,http协议就是用于定义客户端与服务器之间的通讯格式。

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

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

###http1.0与http1.1

在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=0

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

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

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

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

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

###消息头 常用的消息头:

  • 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字节)

© 著作权归作者所有

共有 人打赏支持
_-Leon-_
粉丝 11
博文 17
码字总数 34045
作品 0
朝阳
部门经理
私信 提问
servelet,webservice,RMI的区别

最近项目中有提供或者调用别的接口,在纠结中到底是用servlet还是用webservice,所以上网查看了下他们以及RMI之间的区别,方便加深了解。 首先比较下servlet和webservice下 请求: servlet:...

疯狂的兔子
2014/08/05
0
0
Java Servlet 总结

Servlet 是 Java Web 开发的起点,几乎所有的 Java Web 框架都是基于 Servlet 的封装,其中最主要的就是 Servlet 和 Filter 接口。我重新学习了一遍 Servlet,对 Java Web 开发有了更深的理解...

落英坠露
07/07
0
0
【整理】WEB 容器、WEB服务和应用服务器的区别与联系

对于一个不了解 WEB 开发的人来说,下面的概念是为了免于被别人鄙视和忽悠的~~ 【web 容器】 何为容器: 容器是一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用...

摩云飞
2013/11/22
0
3
图解 & 深入浅出 JavaWeb:Servlet必会必知

Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket “眨眼间,离上一篇写技术博文时隔1个月。怕自己真的生疏了,都是备案太慢惹...

泥沙砖瓦浆木匠
2015/08/21
0
50
精研Servlet,HttpServlet的实现追究

提前声明:个人说的不一定对,如有错误之处,请批评指出. Servlet的优点: servlet可以很好地替代公共网关接口(Common Gateway Interface,CGI)脚本。通常CGI脚本是用Perl或者C语言编写的,它们总...

Zhao-Qian
2012/12/08
0
57

没有更多内容

加载失败,请刷新页面

加载更多

Nginx+Keepalived实现站点高可用

Nginx+Keepalived实现站点高可用

吴伟祥
25分钟前
2
0
git常用命令速查表

任梁荣
29分钟前
2
0
一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)

摘要: 本文介绍使用opencv和yolo完成图像目标检测,代码解释详细,附源码,上手快。 计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别、行人检测等,国内...

阿里云官方博客
31分钟前
0
0
SpringBoot整合RabbitMQ之典型应用场景实战二

实战前言 RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步...

liwei2000
32分钟前
1
0
ES6这些就够了

刚开始用vue或者react,很多时候我们都会把ES6这位大兄dei加入我们的技术栈中。但是ES6那么多那么多特性,我们真的需要全部都掌握吗?秉着二八原则,掌握好常用的、有用的这个可以让我们的开...

文文1
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部