IT兄弟连 JavaWeb教程 HTTP协议
超文本传输协议(HTTP,Hypertext Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的Web文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force)共同合作研究,最终发布了一系列的RFC文档,其中著名的RFC 2616定义了HTTP 1.1。
HTTP基于TCP/IP通信协议来传递数据,HTTP属于OSI网络七层协议模型中的最上层:应用层,由请求和响应组成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP协议的版本有0.9、1.0、1.1和2.0,目前广泛使用的是1.1版本。
HTTP默认端口号为80。它也可以承载在TLS和SSL之上,通过加密、认证的方式实现数据传输的安全,称为HTTPS,HTTPS默认端口号为443。
HTTP协议具有以下特点:
● 简单快速,客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET和POST。每种方法规定了客户与服务器联系时的类型。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
● 灵活,HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
● 无连接,无连接的含义是限制每次连接只处理一个请求。服务器处理完成客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
● 无状态,HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重新传送数据,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要之前的信息时它的应答就比较快。
HTTP协议规定了Web的基本运作过程,以及浏览器与Web服务器之间的通信细节。客户端主动发出HTTP请求,服务器端接收HTTP请求,再返回相应的HTTP响应结果。客户端与服务器端之间的一次信息交换包括以下过程:
● 客户端与服务器端建立TCP连接。
● 客户端发出HTTP请求。
● 服务器端发出响应的HTTP响应。
● 客户端与服务器端之间的TCP连接关闭。
当用户在浏览器中输入URL地址:http://www.itxdl.cn后,浏览器与服务器之间的具体通信过程如下:
● 浏览器与网络上域名为www.itxdl.cn的Web服务器建立TCP连接。
● 浏览器发出要求访问index.html(网站主页,欢迎页)的HTTP请求。
● Web服务器在接收到HTTP请求后,解析HTTP请求,然后发回包含index.html文件数据的HTTP响应。
● 浏览器在接收到HTTP响应后,解析HTTP响应,并在窗口中展示index.html文件。
● 浏览器与Web服务器之间的TCP连接关闭。
当用户在上面的网站页面中用鼠标点击“JavaEE工程师”的超链接时,将会触发浏览器与Web服务器开始一次新的HTTP通信,在这次通信过程中,浏览器会发出请求访问“JavaEE工程师”页面的HTTP请求。
从浏览器与Web服务器的通信过程中,可以看出浏览器应该具备以下功能:
● 请求与Web服务器建立TCP连接。
● 创建并发送HTTP请求。
● 接收并解析HTTP响应。
● 在浏览器窗口中展示HTML文档。
Web服务器应该具有以下功能:
● 接收来自客户端浏览器的TCP连接请求。
● 接收并解析HTTP请求。
● 创建并发送HTTP响应。
HTTP客户端程序和HTTP服务器分别由不同的软件开发商提供,目前最常使用的HTTP客户端程序包括IE(Microsoft Edge)、Firefox、Opera和NetScape、Chrome等,最常用的HTTP服务器包括IIS和Apache等。HTTP客户程序和服务器程序都可以用任意的编程语言编写,那么用VC编写的HTTP客户程序能否与用Java编写的HTTP服务器顺利通信呢?答案是肯定的。此外,运行在Windows平台上的HTTP客户程序能否与运行在Linux平台上的HTTP服务器通信呢?答案也是肯定的。
HTTP客户程序和服务器程序分别用不同的语言编写,并且运行在不用的平台上,双方如何能看得懂对方的数据呢?这要归功于HTTP协议。HTTP协议严格规定了HTTP请求和HTTP响应的数据格式,只要HTTP服务器与客户程序之间的交换数据都遵守HTTP协议,双方都能看得懂对方发送的数据,从而能顺利交流。
HTTP协议由两部分组成,分别是请求部分和响应部分。
1.3.2 HTTP协议中的请求
客户端连接上服务器端后,向服务器端请求某个Web资源,称之为客户端向服务器端发送了一个HTTP请求。
一个完整的HTTP请求包含以下内容:
● 请求行
● 请求头
● 请求空行
● 请求体
一个HTTP请求的示例:
POST /servlet/login.html HTTP/1.1
Host: localhost:8088
Content-Length: 21
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml; q=0.9,image/webp, */*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
name=snape&pwd=123456
现在我们分析上面请求示例中各部分的内容:
● 请求行
HTTP请求中的请求行描述了请求方法,请求的服务器地址以及所使用的HTTP协议版本。
上面的HTTP请求实例中,位于请求行中的POST称之为请求方式,HTTP协议中定义的请求方式如表1.1所示:
表1.1 HTTP协议中定义的请求方式
用户如果没有设置,默认情况下浏览器向服务器发送的都是GET请求,例如在浏览器中直接输入地址访问,点击超链接访问等都是GET请求,用户如果想把请求方式改为POST,可通过更改表单的提交方式实现。
不管POST还是GET,都用于向服务器端请求某个Web资源,这两种方式的区别会在本书的1.3.4小节中进行详细的介绍。
在请求行中,请求方式之后的是URL地址和HTTP协议的版本。它们之间使用空格分隔。
● 请求头
HTTP请求中的请求头由一个个的键值对组成,是用来通知服务器有关客户端的信息的。HTTP请求中常用以下的请求头来告诉服务器一些信息:
(1)Accept:浏览器可接受的MIME类型。
(2)Accept-Charset:浏览器可接受的字符集。
(3)Accept-Encoding:浏览器能够进行解码的压缩格式。
(4)Accept-Language:浏览器所处的语言环境环境。
(5)Host:浏览器通过这个头告诉服务器想访问哪台主机。
(6)Content-Length:表示请求消息的正文长度。
(7)Content-Type:表示请求的MIME类型。
(8)User-Agent:表示浏览器的标识信息。
(9)Cache-Control:标识浏览器缓存机制。
● 请求空行
在HTTP请求的请求头和请求体之间,使用了一个请求空行用来分隔,告诉服务器端已经没有请求头信息了。即使请求体中没有内容,也必须有一个请求空行
● 请求体
请求体用来向服务器发送数据信息,使用“key=value&key=value”的形式,在GET请求中,请求体是空的,GET请求的数据信息在请求行中的URL地址中进行拼接。
1.3.3 HTTP协议中的响应
一个HTTP响应代表了服务器端向客户端返回的数据,一个HTTP完整的响应包含了以下内容:
● 响应行
● 响应头
● 响应体
一个HTTP响应的示例:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Last-Modified: Thu, 08 Sep 2016 12:59:41 GMT
Content-Type: text/html
Content-Length: 588
Date: Thu, 08 Sep 2016 12:59:54 GMT
<html>
<head>
<title>示例1</title>
</head>
<body>
<h1>这是一个HTML页面</h1>
</body>
</html>
现在我们分析上面响应示例中各部分的内容:
● 响应行
以及HTTP响应中的响应行用于描述服务器端对请求的处理结果,其中包括了HTTP协议的版本号已经响应状态码信息,状态码用于表示服务器对请求的处理结果。
响应状态码由三位十进制数字组成,第一个十进制数定义了状态码的类型,后两个数字没有分类的作用。响应状态码共分为5中类型,如下表1.2所示。
表1.2 响应状态码分类
目前比较常见的响应状态码如表1.3所示。
表1.3 常见响应状态码
● 响应头
响应头用于描述服务器的基本信息,以及对返回的数据进行描述,服务器通过这些数据的描述信息,通知客户端如何处理服务器端返回的数据。HTTP响应中常用以下的响应头来告诉浏览器一些信息:
(1)Server:服务器名称,一般由Web服务器设置的,如:Apache、Tomcat。
(2)Location:通过设置Location通知浏览器跳转到指定的地址再次发送请求。
(3)Content-Encoding:该响应头告诉浏览器返回的数据的压缩格式。
(4)Content-Length:该响应头告诉浏览器返回的数据的长度。
(5)Content-Type:通过该响应头告诉浏览器返回的数据的类型。
(6)Date:表示当前的GMT时间。
(7)Last-Modified:表示文档的最后修改时间。
● 响应体
在HTTP响应中的响应体中,包含了服务器端返回给浏览器的数据。根据Content-Type类型的不同,响应体中的数据形式也不同。
1.3.4 HTTP协议中的GET和POST请求的区别
● GET请求:
(1)GET请求的数据,以键值对的形式在请求行中的URL后,以?进行拼接,多个键值对之间使用&拼接。
(2)GET请求只能传输字符串类型的数据。
(3)GET请求因浏览器限制URL长度的原因只能传输少量数据。
(4)因为GET请求会将传输的数据显示在地址栏中,所以相对POST请求不安全。
● POST请求:
(1)POST请求的数据,以键值对的形式存储在请求体中,多个键值对之间使用&拼接。
(2)POST请求可以传输任意类型的数据。
(3)POST请求对传输的数据的大小没有限制。
(4)相对于GET请求,POST请求不会将传输的数据显示在地址栏中,较为安全。
IT兄弟连 JavaWeb教程 HTTP协议的更多相关文章
- IT兄弟连 JavaWeb教程 Servlet API
Java Servlet是运行在带有支持Java Servlet规范的解释器的web服务器上的Java类. Servlet可以使用javax.servlet和javax.servlet.http包创建 ...
- IT兄弟连 JavaWeb教程 JSON和JSON字符串
JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是易于阅读和解析.当客户端和服务器端需要交互大量数据时,使用JSON格式传输 ...
- IT兄弟连 JavaWeb教程 文件下载技术
● 列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...
- IT兄弟连 JavaWeb教程 文件上传技术
在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...
- IT兄弟连 JavaWeb教程 监听器4
感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...
- IT兄弟连 JavaWeb教程 监听器3
监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession.HttpServletRequest这三个对象中的属性变更信息事件的监听器 ...
- IT兄弟连 JavaWeb教程 监听器2
4 监听HttpSession域对象的创建和销毁 HttpSessionListener接口用于监听HttpSession对象的创建和销毁. 创建一个Session时,激发sessionCreate ...
- IT兄弟连 JavaWeb教程 监听器1
1 基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...
- IT兄弟连 JavaWeb教程 过滤器3
过滤器案例:字符编码过滤器 在JavaWeb程序开发中,由于Web容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码现象. 图3 无字符编码过滤器 从上图可以看出 ...
随机推荐
- cocos2d-x触摸事件优先级
CCTouchDispatcher是管理cocos2d-x中全部Touch事件派发的类, CCTouchDispatcher中包括了两个CCTouchHandler的列表, 分别存储Standa ...
- C#连接池
C#数据库连接池 MySql SqlServer 查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处 1. 建立连接池 1 using MySql ...
- hibernate工作原理及作用
转载自 http://www.cnblogs.com/dashi/p/3597969.html#commentform JAVA Hibernate工作原理及为什么要用 hibernate 简介:hi ...
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决的方法
今天在使用android studio在Genymotion上调试程序出现INSTALL_FAILED_CPU_ABI_INCOMPATIBLE导致程序安装不了: 后来百度发现是要安装:http:// ...
- DRF之视图组件 三次封装
1.为什么要进行封装 1.1 在处理表的时候,如果有几十张表都需要增删改查查时,如果每一张表都写这些方法,会让代码显得冗余,所以需要将这些方法进行封装,然后不同的表都去继承这写方法.(这是思路) 1. ...
- 安装NLTK
在网上找了一圈,没找到几个靠谱的安装流程,在http://nltk.org/install.html上找到各平台下安装流程: Windows平台: 以下操作假定你的机器上还没有安装Python,如果你 ...
- To verify Hadoop releases using GPG
To verify Hadoop releases using GPG http://hadoop.apache.org/releases.html To verify Hadoop releases ...
- org.eclipse.swt.SWTError: No more handles的解决办法
今天装了JBoss Tools 3.1 插件后,eclipse 打开jsp文件老是报错,或者要我关闭: org.eclipse.swt.SWTError: No more handles 网上找了两个 ...
- 贞鱼传教&&贞鱼传教(数据加强版)
http://acm.buaa.edu.cn/problem/1381/ 贞鱼传教[问题描述] 新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教.说干就干 ...
- (linux)块设备驱动程序
1.4.1 Linux块设备驱动程序原理(1) 顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备.块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例如 ...