- 浏览: 138004 次
文章分类
最新评论
一、简介
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
超文本传输协议,是一种无状态协议,就是说客户端发送一次请求,服务器端接收请求,经过处理返回给客户端信息,然后客户端和服务器端的链接就断开了,为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息,有2中解决方案,一是在客户端保存,二是在服务器端保存。
1.在客户端保存:Cookie
2.在服务器端保存:Session(session需要依靠cookie来实现)
3.在用户禁用cookie的限制下,只能使用URL重写的方式在每次请求之后附上一个键值对来保存客户端的信息。
4.隐藏表单。<input type="hidden" name="method" value="login">
HTTP协议的请求消息和响应消息有固定的格式
-------------------------请求头格式------------------------------------------------------------------
HTTP请求行
(请求)头
空行
可选的消息体
---------------------------响应头格式------------------------------------------------------------------
HTTP状态行
(应答)头
空行
可选的消息体
HTTP 超文本传输协议 人类之所发展得如此快,就是因为有自己的语言
1、所谓超文本:即纯文本语言,不依赖于任何特定语言,任何语言都可以操作它(如java、c++)
2、传入:HTTP的应用价值在于传输
3、HTTP是无状态协议
基于请求/响应模型
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求服务器会认为新的客户端
二、 HTTP请求
HTTP请求信息(浏览器信息)
HTTP协议的请求和响应都有一定的规则,这篇网站当中首先着重介绍一下HTTP协议的请求协议的内容。
HTTP协议的请求主要由一下几部分组成:请求行,请求头,请求体(post)
请求行\r\n
请求头1\r\n
请求头1\r\n
...
\r\n
请求体(Post方式)\r\n
我们分别按块来说明一下消息请求的格式。
1、请求行:GET/POST(流的组织(请求)方式) URL(地址+目录) 版本号
首先来说一下请求行,请求行主要由三部分组成,请求方法,请求路径,请求协议
请求方法:HTTP规范定义了8种可能的请求方法:
GET 检索URI中标识资源的一个简单请求
HEAD 与GET方法相同,服务器只返回状态行和头标,并不返回请求文档
POST 服务器接受被写入客户端输出流中的数据的请求
PUT 服务器保存请求数据作为指定URI新内容的请求
DELETE 服务器删除URI中命名的资源的请求
OPTIONS 关于服务器支持的请求方法信息的请求
TRACE Web服务器反馈Http请求和其头标的请求
CONNECT 已文档化但当前未实现的一个方法,预留做隧道处理
当然我们最常用的也就是get和post方法,get方法的请求方式比较简单,所有请求的参数都显示追加在请求的url后面,而且请求长度有限制,post方式的请求参数都追加在请求体当中,消息长度没有限制而且以隐式的方式进行发送,安全性相对较高(这个安全性对于现在的网络技术也没有什么可安全的了,^_^)。
请求路径:请求路径可以是相对或者绝对的方式,绝对路径不去阐述,相对路径是相对于当前TCP连接的主机的路径(HTTP/1.0方式),在HTTP/1.1方式当中相对于的是请求头当中的host域,HTTP/1.1的新特性会在以后的方式当中进行阐述
请求协议:目前常用的支持HTTP/1.0和HTTP/1.1方式,HTTP/1.1和HTTP/1.0之间存在不少差异性,后面的博客当中会专门去讨论两者之间的异同,以及性能差异。
2、请求头:Host:客户端IP和端口
User-Agent:浏览器信息
Accept:客户端能接收的数据类型
Accept-encoding:是否支持压缩的流
Accept-charset:客户端字符编码集
请求头都是以key:value形式进行保存的,里面记录了客户端的一些基本信息,常用的请求头如下所示
Accept:浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,
或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,
当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,
Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入
ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content-Length:表示请求消息正文的长度。
Cookie:这是最重要的请求头信息之一,参见后面《Cookie处理》一章中的讨论。
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host:初始URL中的主机和端口。
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,
否则返回304“Not Modified”应答。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的
本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
如果想了解更详细的请求头信息可以去w3c的官网去查阅
3、请求体
请求体(又叫请求正文)是post请求方式当中的请求参数,以key=value形式进行存储,多个请求参数之间用&连接,如果请求当中有请求提,那么在请求头当中的Content-Length属性中记录的是该请求体的长度。
下面来看一个还算完整的请求消息吧,这样可能会稍微直观一点
POST hysj.jsp HTTP/1.1
Host: search.cnipr.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://search.cnipr.com/cnipr/zljs/hyjs-biaodan-y.jsp
Content-Length: 405
username=guest&extension=&issearch=on&searchword=pd%3D%2820100901%29&presearchword=&sortfield=RELEVANCE&sRecordNumber=&searchType=0&searchFrom=0&channelid=14%2C15%2C16&searchChannel=14%2C15%2C16&strdb=14&strdb=15&strdb=16&cizi=2&sortcolumn=RELEVANCE&R1=-&txtA=&txtB=&txtC=&txtD=20100901&txtE=&txtF=&txtG=&txtH=&txtI=&txtJ=&txtK=&txtL=&txtM=&txtN=&txtP=&txtQ=&txtR=&txtSearchWord=&Submit=%BC%EC%A1%A1%CB%F7
三、 HTTP响应
HTTP响应信息(服务器信息)
1、状态行:HTTP版本 服务器状态(比如:404找不到...) 描述信息
2、响应头
content-text:服务器发送信息的类型
date:发送时间
server:服务器类型
3、消息体:服务器发送给客户端的页面内容
HTTP响应的格式类似于请求的格式,主要由,响应行,响应头,响应体组成,其格式如下所示
响应行\r\n
响应头\r\n
响应头\r\n
...
响应体
响应行:标识服务器端对客户端请求的处理结果,主要由响应状态信息,响应状态码,服务器协议
HTTP协议:参考请求头当中对协议的描述
HTTP状态码:
100 继续
101 分组交换协
200 OK
201 被创建
202 被采纳
203 非授权信息
204 无内容
205 重置内容
206 部分内容
300 多选项
301 永久地传送
302 找到
303 参见其他
304 未改动
305 使用代理
307 暂时重定向
400 错误请求
401 未授权
402 要求付费
403 禁止
404 未找到
405 不允许的方法
406 不被采纳
407 要求代理授权
408 请求超时
409 冲突
410 过期的
411 要求的长度
412 前提不成立
413 请求实例太大
414 请求URI太大
415 不支持的媒体类型
416 无法满足的请求范围
417 失败的预期
500 内部服务器错误
501 未被使用
502 网关错误
503 不可用的服务
504 网关超时
505 HTTP版本未被支持
响应状态信息:参照状态码
响应头:类似于请求头的key:value形式,常用响应头如下所示
Allow 服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。
Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?
Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。
注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。
注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问
<---------------------------------------------------------------------------------------------------------------------------------->
响应体也就是网页的正文内容,一般在响应头当中会用Content-Length来明确响应体的长度,便于浏览器接收,对于大数据量的正文信息,也会使用chunked的编码方式,该编码方式会在后期进行详细描述。
四、模型
客户端-----通过socket建立连接-----服务器
客户端-----请求----->服务器
客户端<-----响应-----服务器
客户端-----断开-----服务器
下一次连接.......
发表评论
-
java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json
2013-05-13 13:13 1253主要实现把java对常用的一些数据转换成Json,以便前台的 ... -
(转载)Java Socket实战之五:使用加密协议传输对象
2013-01-07 16:38 646前面几篇博文提到了Socket中一些常用的用法,但是对于一些有 ... -
(转载)Java Socket实战之四:传输压缩对象
2013-01-07 16:28 598上一篇文章说到了用Java Socket来传输对象,但是在有 ... -
(转载)Java Socket实战之三:传输对象
2013-01-07 16:25 684前面两篇文章介绍了怎样建立Java Socket通信,这一篇 ... -
(转载)Java Socket实战之二:多线程通信
2013-01-07 16:23 1005说到怎样写一个最简单的Java Socket通信,但是在上一 ... -
(转载)Java Socket实战之一:单线程通信
2013-01-07 15:46 683现在做Java直接使用Socket的情况是越来越少,因为有很 ... -
map的三种遍历方法!
2012-12-20 16:54 643map的三种遍历方法! 集合的一个很重要的操 ... -
JAVA数组的定义及使用方法
2012-12-13 11:34 777数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来 ... -
(转载)fastJson
2012-12-13 10:48 655FastJSON是一个很好的java开源json工具类库,相比 ... -
(转载)FTP文件上传与下载
2012-12-06 15:14 821实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有 ... -
ORA-01460: 转换请求无法实现或不合理
2012-11-27 17:27 3922oracle10g数据库执行数据库更新sql时报错: Cau ... -
配置TOMCAT(,JAVA_HOMECATALINA_HOME,CLASSPATH)环境变量
2012-11-18 15:42 4687配置TOMCAT(,JAVA_HOMECATALI ... -
(转载)验证码无法显示:Could not initialize class sun.awt.X1 解决方案
2012-11-16 14:41 689网站验证码突然无法显示,并报如下错误。 Caused by: ... -
(转载)linux 下tomcat 报java.lang.OutOfMemoryError: PermGen space及其解决方法
2012-11-16 11:20 632PermGen space的全称是Permanent Gene ... -
JSP内置对象
2012-11-13 15:42 5711.request对象 客户端的请求信息被封装 ... -
用Java删除文件夹里的所有文件
2012-11-11 15:27 838import java.io.File;publ ... -
通过Java几行代码截取屏幕
2012-11-11 15:25 570通过java.awt.Robot的createScreenCa ... -
oracle日期类型字段的操作
2012-10-26 09:32 693在java对oracle的操作中 ... -
验证码无法显示:Could not initialize class sun.awt.X1 解决方案
2012-10-22 11:10 1011网站验证码突然无法显示,并报如下错误。 Caused by: ... -
java socket编程
2012-09-29 17:41 571一,网络编程中两个 ...
相关推荐
#### 一、SIP协议简介 **SIP(Session Initiation Protocol,会话初始协议)**是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的一种多媒体通信协议。它是一种基于文本的应用层控制协议,主要...
HTTP协议的规范由一系列的RFC文档定义,其中最重要的一个版本是RFC2616,定义了HTTP/1.1的标准。 #### 二、HTTP的工作原理 HTTP是一种无状态协议,这意味着每一次请求都是独立的,服务器不会保存关于客户端请求的...
### 二、OIF-CEI-04.0协议简介 **标签**:“OIF协议 OIF” 这些标签进一步确认了文档与OIF及OIF协议相关。OIF-CEI-04.0协议是OIF组织发布的一份实施协议,旨在规定通用电气接口(Common Electrical I/O, CEI)的电气...
【SIP协议简介】 SIP(Session Initiation Protocol,会话初始协议)是一种用于创建、修改和终止多媒体通信会话的协议,广泛应用于VoIP(Voice over IP)领域。SIP并不规定会话的具体内容,而是专注于管理和控制...
### HTTP协议知识点详解 #### 一、HTTP协议概述 **HTTP**(HyperText Transfer Protocol)是一种用于从WWW服务器传输超文本到本地浏览器的应用层协议。它定义了客户端(通常是浏览器)与服务器之间的通信规则,是...
### HTTP协议深度解析 HTTP(HyperText Transfer Protocol),即超文本传输协议,是互联网上应用最为广泛的一种网络协议。它负责在Web服务器和浏览器之间发送和接收数据,采用请求-应答模式,确保数据交互的高效性...
### HTTP1.1协议简介 HTTP(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地浏览器的传输协议。HTTP1.1是HTTP协议的一个版本,由Internet Engineering Task ...
HttpCore 4.3.3是这个开源库的一个版本,它提供了基础的HTTP协议处理功能,为开发者提供了构建复杂HTTP客户端和服务端应用的工具。本文将详细探讨HttpCore 4.3.3.jar的核心概念、功能以及如何在实际项目中应用。 1....
### HTTP协议概念简介 HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网上最常用的网络协议之一,主要用于从Web服务器传输超文本到本地浏览器的传输协议。它是一种基于请求-响应模式的、无状态的、...
它封装了HTTP协议的相关操作,如GET、POST、PUT等请求方法,以及处理响应、设置请求头、管理cookies等复杂任务。开发者无需关心底层HTTP通信的细节,只需通过简单的API调用即可完成网络请求。 在压缩包文件中,`....
**Nginx简介** Nginx是由Igor Sysoev开发的一款高性能的HTTP和反向代理服务器,同时也是邮件协议代理服务器。它以其事件驱动的架构和非阻塞I/O模型而著名,能够在高并发环境下保持出色的性能。Nginx广泛应用于网站...
http----1 什么是HTTP HTTP的定义、功能、特点等。 2 HTTP的历史 HTTP/0.9、HTTP/1.0、HTTP/1.1 3 HTTP中的有关术语 请求、响应、代理、缓存等 4 HTTP与MIME 5 HTTP与URI
Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议 视频教程+笔记+课件+资料 虽然在课程中还讲解了部分HTTP协议的技术,但是课程的重点还是NGINX、JVM、Tomcat三相运维与配置技术。课程内容包括了Nginx进阶...
### HTTP协议头简介 HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它规定了客户端与服务器之间如何进行数据交互及数据包格式,使得服务器能够“知道”...
**Nginx简介** Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,以其高并发处理能力和稳定性著称。它能够处理静态内容,如图片、CSS和JavaScript文件,并能通过反向代理和负载均衡来分发动态内容请求。此外...
HTTP协议基于请求/响应模型,客户端发起请求,服务器响应请求并返回数据。 **HTTP请求格式**: 一个完整的HTTP请求由以下部分组成: 1. **请求行**:包括请求方法(如GET、POST)、请求URL(统一资源标识符,...
### HTTP协议核心知识点详解 #### 一、HTTP协议概述 **HTTP**(HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的信息传输协议。它最初由Tim Berners-Lee等人设计,目的是为了支持万维网的...
#### 一、HTTP协议简介 ##### 1.1 什么是HTTP协议? HTTP(HyperText Transfer Protocol),即超文本传输协议,是一种用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议...
#### 一、Ntrip通讯协议简介 **Ntrip**(Networked Transport of RTCM via Internet Protocol)是一种专用于CORS(Continuously Operating Reference Stations)系统的网络通讯协议。CORS系统是一种利用GPS技术进行...