文档章节

(JavaEE-03)HTTP协议

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

#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-_
粉丝 10
博文 17
码字总数 34045
作品 0
朝阳
部门经理
Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

罗荣熙
2012/12/01
0
2
精研Servlet,HttpServlet的实现追究

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

Zhao-Qian
2012/12/08
0
57
Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。 init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet 对象。可以配...

ArlenXu
2015/01/24
0
0
SIP Servlet开发实例讲解

这篇博文的开发实例是必须基于前面一篇“SIP Servlet开发环境配置”,如果没有正确配置SIP Servlet开发环境的,请参考“SIP Servlet开发环境配置”篇。 首先,我们基于上一篇中提到的方法创建...

TreasureWe
2015/11/02
0
1
Apache Qpid JMS AMQP 0-x 6.3.1 发布

Apache Qpid JMS AMQP 0-x 6.3.1 已发布。Qpid JMS AMQP 0-x 是兼容 JMS 1.1 的客户端,等同于 AMQP 0-8,0-9,0-9-1 和 0-10。Qpid JMS 是一个使用 Qpid Proton 协议引擎的 Java Message Ser......

淡漠悠然
05/21
0
0
servelet,webservice,RMI的区别

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

疯狂的兔子
2014/08/05
0
0
浅谈如何删除JSP编译后的空行

http://blog.csdn.net/st780206/archive/2010/03/12/5372736.aspx 当你在客户端用view source看JSP生成的代码时,会发现有很多空行,他们是由< %...% >后的回车换行而生成的,也就是说每一行...

晨曦之光
2012/03/09
0
0
客户端通过http协议 post xml型字符串数据到后台工作流程(请指点)

一.客户端流程 两种方法:1.通过httpurlconnection 2.通过apache开源的httpclient 代码示例为 urlconnection方法: StringBuilder responseBuilder = null;BufferedReader reader = null;Bu......

Enjoy前端开发
2013/08/23
0
0
Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

№贪↗恋♂
2012/08/08
0
0
Java Servlet 总结

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

落英坠露
07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow 作用域与操作符的受限范围

variable_scope 影响变量和操作符 name_scope 只影响操作符 with tf.name_scope(""),使用空字符串将作用域返回到顶层 tf.variable_scope("") 相当于添加一个空层 import tensorflow as tf...

阿豪boy
10分钟前
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
12分钟前
0
0
崛起于Springboot2.X之前端模版freemaker(23)

1、配置文件 spring: freemarker: allow-request-override: false cache: true check-template-location: true charset: UTF-8 content-type: text/html ......

木九天
28分钟前
1
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
30分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
35分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
36分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
39分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
46分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
50分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部