*********************HTTP基本交互***************************php
HTTP请求格式:
HTTP 请求由三部分组成:请求行、请求头和请求正文
请求行: 请求方法 URL 协议/版本html
例如:GET /books/?sex=man&name=Professional HTTP/1.1
请求方法有不少,例如:GET Post HEAD PUT DELETE 等等跨域
GET与Post的区别:
一、在客户端,GET方式在经过URL提交数据,数据在URL中能够看到;POST方式,数据放在HTTP包的body中。
二、GET方式提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST则没有此限制。
三、安全性问题。正如在(1)中提到,使用 GET 的时候,参数会显示在地址栏上,而 Post 不会。因此,
若是这些数据是中文数据并且是非敏感数据,
那么使用 GET;若是用户输入的数据不是中文字符并且包含敏感数据,那么仍是使用 post为好。
4.、服务器取值方式不同。GET方式取值,如php可使用$_GET来取得变量的值,而POST方式经过$_POST
来获取变量的值
5. 安全的和幂等的。所谓安全的意味着该操做用于获取信息而非修改信息。幂等的意味着对同一 URL 的多
个请求应该返回一样的结果Get操做通常不会产生反作用。POST 表示可能改变服务器上的资源的请求。
仍然以新闻站点为例,读者对文章的注解应该经过 POST 请求实现,由于在注解提交以后站点已经不一样了浏览器
HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体。一个HEAD请求的响应中,HTTP头中包含的元信
息应该和一个GET请求的响应消息相同。
这种方法能够用来获取请求中隐含的元信息,而不用传输实体自己。也常常用来测试超连接的有效性、可用性
和最近的修改。欲判断某个资源是否存在,咱们一般使用GET,但这里用HEAD则意义更加明确。缓存
put 和post的区别:这两个方法都有更新或者建立资源的意思
可是put和post有什么区别呢:
在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。
idempotent的意思就是说一个方法重复执行屡次,产生的效果是同样,就是idempotent的
假如咱们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?若是产生了
两个博客帖子,那就说明这个服务不是idempotent的,
由于屡次使用产生了反作用了嘛;若是后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。
前一种状况,应该使用POST方法,后一种状况,应该使用PUT方法。
请求头:
每一个头域由一个域名,冒号(:)和域值三部分组成。
常见的请求头以下:
Transport头域:
Connection:Keep-Alive 表示是否须要持久链接,HTTP1.1版本还引入了管道机制(pipelining)
即在同一个TCP链接里面,客户端能够同时发送多个请求。这样就进一步改进了HTTP协议的效率tomcat
服务器也能够传送多个回应,因此须要一种机制区分数据报是属于哪种回应,这就是Content-length
这个字段所起的做用,好比本次回应的长度是100个字节,后面的字节就属于下一个回应了
Host头域:
Host请求报头域主要用于指定被请求资源的Internet主机和端口号
Client头域:
Accept:浏览器能够接受的媒体类型,例如text,html,image等等,若是是*/*则表示浏览器能够接受全部类型
Accept-Encoding:浏览器申明本身接收的编码方法,一般指定压缩方法
Accept-Language: 浏览器声明本身接受的语言
User-Agent:告诉HTTP服务器,客户端使用的操做系统和浏览器的名称和版本
Accept-Charset:浏览器声明本身接受的字符集
Cookie/Login 头域:
Cookie: 将Cookie的值发送给HTTP 服务器
Entity头域:
Content-Length:发送给HTTP服务器数据的长度。
Content-Type:表示数据类型和使用的字符集 例如:text/html;charset=utf-8
Miscellaneous 头域
Referer: 提供了Request的上下文信息的服务器,告诉服务器我是从哪一个连接过来的
Cache 头域
If-Modified-Since:
把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。
若是时间一致,那么返回304,客户端就直接使用本地缓存文件。若是时间不一致,就会返回200和新的文件内容。
客户端接到以后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中
Cache-Control:指定缓存机制的规则 有如下选项:Public(能够被任何缓存所缓存),private(内容只缓存到私有缓存中),
no-cache(全部内容都不会被缓存)
HTTP响应格式:
HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文
1.状态行: 状态行由协议版本、数字形式的状态代码,及相应的状态描述组成
200 OK //客户端请求成功
404 Not Found //请求资源不存在,eg:输入了错误的URL
2.消息包头:
Cache头域
Date:做用:生成消息的具体时间和日期,即当前的GMT时间。
Expires:做用: 浏览器会在指定过时时间内使用本地缓存,指明应该在何时认为文档已通过期,从而再也不缓存它。
Vary:例如: Vary: Accept-Encoding
Cookie/Login 头域
P3P:做用: 用于跨域设置Cookie, 这样能够解决iframe跨域访问Cookie的问题
Set-Cookie
做用: 很是重要的header, 用于把Cookie 发送到客户端浏览器, 每个写入Cookie都会生成一个Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Entity实体头域:
实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。
ETag:
做用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
Last-Modified
做用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
Content-Type:
做用:WEB服务器告诉浏览器本身响应的对象的类型和字符集,
Content-Length:
指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程当中,Content-Length的方式要预
先在服务器中缓存全部数据,而后全部数据再一古脑儿地发给客户端。
Content-Encoding:
做用:文档的编码(Encode)方法。通常是压缩方式。
Content-Language:
做用: WEB服务器告诉浏览器本身响应的对象的语言安全
Miscellaneous 头域
Server:做用:指明HTTP服务器的软件信息 例如:Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By:做用:表示网站是用什么技术开发的。例如: X-Powered-By: PHP/5.2.5服务器
Transport头域
Connection 例如Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的
TCP链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接网络
Location:做用: 用于重定向一个新的位置, 包含新的URL地址
3.响应正文:
响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔session
*********************HTTPS内容***********************
session和 Cookie
对称秘钥:即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算
SSL TLS:
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)
是为网络通讯提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络链接进行加密
SSL/TLS协议的基本过程:
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成"对话密钥"。
(3) 双方采用"对话密钥"进行加密通讯。
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,而后用公钥加密信息,服务器收到密文后,用本身的私钥解密。
前两步又称握手阶段
1.首先客户端发出请求 --> ClientHello
好比:客户端支持的TLS版本 ; 支持的加密方法 ; 支持的压缩方法 ; 一个客户端生成的随机数
2.服务器回应 --> SeverHello
确认使用的加密通讯协议版本,好比TLS 1.0 若是客户端和服务器版本不一致,服务器就会关闭加密服务
确认使用的加密方法;一个服务器生成的随机数; 服务器证书
3. 客户端回应:首先会验证服务器发过来的证书。若是证书不是可信机构颁布、或者证书中的域名与
实际域名不一致、或者证书已通过期,就会向访问者显示一个警告,由其选择是否还要继续通讯。
而后客户端从证书中取出服务器的公钥,并向服务器发送下面的信息:
一个随机数,这个随机数用公钥加密,防止被窃听;
编码改变通知,表示随后的信息都将用双方商定的加密方法和密码发送;
客户端握手结束通知。
4. 服务器收到就利用私钥解密消息获得第三个随机数,而后计算本次会话所用的“会话秘钥”
(至此,服务器和客户端已经有三个随机数,而后双方就使用以前约定好的加密方法生成同一把
“会话秘钥”,这就是后面使用的对称加密的秘钥),而后服务器就会客户端发送如下消息:
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,
用来供客户端校验。
等握手阶段结束之后,客户端与服务器进入加密通讯,就彻底是使用普通的HTTP协议,
只不过用"会话密钥"加密内容。
握手阶段中须要注意的三点:
(1)生成对话密钥一共须要三个随机数。
(2)握手以后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),
无其余做用。
(3)服务器公钥放在服务器的数字证书之中。
************HTTP1.0与HTTP1.1的区别*******************
HTTP 1.1在继承了HTTP 1.0优势的基础上,也克服了HTTP 1.0的性能问题
1.HTTP1.1支持了持久链接Persistent Connection,并默认使用持久链接。为此也增长了新的请求头:
Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持链接;
Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭链接
2.HTTP1.1新增了请求的流水线(Pipelining)机制,或者叫管道机制。即在同一个TCP链接里面,
客户端能够同时发送多个请求.管道机制则是容许浏览器同时多个请求,可是服务器仍是按照请
求顺序回应各个请求。为此也新增了字段Content-Length
3.分块传输编码
使用Content-Length字段的前提条件是,服务器发送回应以前,必须知道回应的数据长度。
对于一些很耗时的动态操做来讲,这意味着,服务器要等到全部操做完成,才能发送数据,显然这样的效率不高。
更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。
只要请求或回应的头信息有Transfer-Encoding字段,就代表回应将由数量未定的数据块组成.
每一个非空的数据块以前,会有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,
就表示本次回应的数据发送完了.
4.新增了HOST域
在HTTP1.0中认为每台服务器都绑定一个惟一的IP地址,所以,请求消息中的URL并无传递主机名(hostname)。
但随着虚拟主机技术的发展,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),而且
它们共享一个IP地址。在HTTP 1.1中增长Host请求头字段后,WEB浏览器可使用主机头名来明确表示要访问
服务器上的哪一个WEB站点,这才实现了在一台WEB服务器上能够在同一个IP地址和端口号上使用不一样的主机名来
建立多个虚拟WEB站点
5.新增了请求方法
好比OPTIONS,PUT, DELETE, TRACE, CONNECT等方法
6.新增了支持传递部份内容的功能
HTTP1.1支持传送内容的一部分。比方说,当客户端已经有内容的一部分,为了节省带宽,能够只向服务器请求一部分
HTTP/1.1中在请求消息中引入了range头域,它容许只请求资源的某个部分。在响应消息中Content-Range头
域声明了返回的这部分对象的偏移值和长度。若是服务器相应地返回了对象所请求范围的内容,则响应码为206
(Partial Content),它能够防止Cache
将响应误觉得是完整的一个对象
7.节约宽带
另一种浪费带宽的状况是请求消息中若是包含比较大的实体内容,但不肯定服务器是否可以接收该请求(如是否有权限),
此时若贸然发出带实体的请求,若是被拒绝也会浪费带宽。
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,若是服务器由于权限拒绝了请求,
就回送响应码401(Unauthorized);若是服务器接收此请求就回送响应码100,客户端就能够继续发送带实体的完整请求了。
注意,HTTP/1.0的客户端不支持100响应码。但可让客户端在请求消息中加入Expect头域,并将它的值设置为100-continue
8.新增了一些状态码
***********************session与Cookie******************
google浏览器网址输入栏左边有个 圆圈i,点开后就有Cookie这个文件夹
Cookie(甜饼)
Cookie机制是干什么的,有什么用,怎么用
1.Http是无状态的协议,也就是说同一客户端这一次与下一次发送的请求没有对应关系,若是说相似于用户购买东西
先后买的东西都要放在同一个帐号上的购物车里,就须要一种机制确保服务器知道每次客户身份,这样就能够先后客
户是什么关系,是否是同一个用户了。
2.Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户
端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同
该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。
Cookie对象使用key-value属性对的形式保存用户状态,
一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie
3.如何查看Cookie内容
两种方式 第一种方式利用F12 第二种方式在网址左侧能够查看,后续图片补上
4.Cookie的几个特色:
①:Cookie的不可跨域名性
对于不一样的域名会有对应的Cookie,Cookie是保存在客户端上由浏览器来管理,浏览器能保存只处理指定域名的Cookie,
从而保证用户的隐私安全。
②:Cookie的有效性
Cookie的maxAge决定着Cookie的有效期,单位为秒。
客户端能够采用两种方式来保存这个 Cookie 对象,一种方式是保存在客户端内存中,称为临时 Cookie,浏览器关闭后
这个 Cookie 对象将消失。 另一种方式是保存在客户机的磁盘上,称为永久 Cookie。之后客户端只要访问该网站,
就会将这个 Cookie 再次发送到服务器上,前提是这个 Cookie 在有效期内,这样就实现了对客户的跟踪。
Session机制:
除了使用Cookie,Web应用程序中还常用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态
的机制,使用上比Cookie简单一些,相应的也增长了服务器的存储压力。Session是另外一种记录客户状态的机制,不一样的
是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以
某种形式记录在服务器上。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。若是说Cookie机
制是经过检查客户身上的“通行证”来肯定客户身份的话,那么Session机制就是经过检查服务器上的“客户明细表”来确认
客户身份。Session至关于程序在服务器上创建的一份客户档案,客户来访的时候只须要查询客户档案表就能够了。
Session如何实现?
1.利用Cookie
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。
tomcat生成的sessionid叫作jsessionid。而后服务器经过Cookie发送给客户端。当客户端再发起请求的时候,
将在Cookie头中携带这个sessionid。这样服务器可以找到这个
客户端对应的Session。没有找到则会新建Session.
2.若是客户端浏览器不支持Cookie或者将Cookie禁止了,能够利用URL重写的办法来让服务器获取到session id。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。
服务器可以解析重写后的URL获取Session的id。这样即便客户端不支持Cookie,也可使用Session来记录用户状态。
Cookie和Session有如下明显的不一样点:1)Cookie将状态保存在客户端,Session将状态保存在服务器端;2)Cookies是服务器在本地机器上存储的小段文本并随每个请求发送至同一个服务器。Cookie最先在RFC2109中实现,后续RFC2965作了加强。网络服务器用HTTP头向客户端发送Cookies,在客户终端,浏览器解析这些Cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些Cookies。Session并无在HTTP的协议中定义;3)Session是针对每个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪一个用户session变量,这个值是经过用户的浏览器在访问的时候返回给服务器,当客户禁用Cookie时,这个值也可能设置为由get来返回给服务器;4)就安全性来讲:当你访问一个使用session 的站点,同时在本身机子上创建一个Cookie,建议在服务器端的SESSION机制更安全些.由于它不会任意读取客户存储的信息。5 )Cookie不是很安全,别人能够分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用session;6 )session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用Cookie;