HTTP协议工作于客户端-服务端架构为上。协议定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传给浏览器。
文章目录
一、主要特点
http协议的主要特点如下:
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 支持B/S及C/S模式。
二、请求报文
HTTP请求报文是客户向服务器发送的报文。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,结构如下图:

1、请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段,组成,它们用空格分隔,例如:GET /index.html HTTP/1.1
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET和POST方法;
GET:当client要从server中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给client。
POST:当client给服务器提供信息较多时,使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以key/value的形式出现,可以传递大量数据,可用来传递文件
2、消息头部
请求头部由key/value键值对组成,每行一对,key和value用冒号":"分隔,请求头部通知服务器有关于client端的请求类型,典型的请求头:
User-Agent:产生请求的浏览器类型
Accept:client端可识别的内容类型列表
Host:请求的主机名,允许多个域名同处一个ip地址,即虚拟主机
3、空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器请求头结束。
对于一个完整的http请求来说空行是必须的,否则服务器会任务本次请求的数据尚未完全发送到server,处于等待状态。
4、请求正文
请求数据不在GET方法中使用,而是在POST中使用。POST方法适用于需要client填写表单的场合,与请求数据相关的最常用的请求头是Content-Type 和
三、响应报文
HTTP响应报文是服务器向客户的回答。结构如下:

由3部分组成,分别为:协议版本,状态码和状态码描述。他们之间由空格分隔。常见的状态码如下:
200:响应成功
302:重定向,跳转地址通过响应头中的位置属性指定(JSP中Forward和Redirect之间的区别) (阿里经常会问)
400:客户端请求有语法错误,不能被服务器识别 403 服务器接收到请求,但是拒绝提供服务(认证失败)
404:请求资源不存在
500:服务器内部错误
四、GET和POST
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
具体区别如下:
- GET提交的数据会放在URL之后,以分割URL和传输数据,参数之间以&相连,
提交的url大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制. - GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
- GET请求会被浏览器主动cache,而POST不会。
- GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
五、转发和重定向
5.1 重定向:
客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。
1、HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。
2、调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL。
3、HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。以前的request中存放的变量全部失效,并进入一个新的request作用域。
5.2 转发
客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。
1、调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
2、RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程
3、HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
无论是转发还是重定向,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。
转发是服务器行为,重定向是客户端行为。
假设你去办理某个执照
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
六、cookie和session
- cookie位于用户的计算机上,用来维护用户计算机中的信息,直到用户删除。比如我们在网页上登录某个软件时输入用户名及密码时如果保存为cookie,则每次我们访问的时候就不需要登录网站了。我们可以在浏览器上保存任何文本,而且我们还可以随时随地的去阻止它或者删除。我们同样也可以禁用或者编辑cookie,但是有一点需要注意不要使用cookie来存储一些隐私数据,以防隐私泄露
Cookie是可以覆盖的,如果重复写入同名的Cookie,那么将会覆盖之前的Cookie。如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。 - session称为会话信息,位于web服务器上,可以无限存储变量。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?
事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
cookie在每次请求时都把SessionId自动带到服务器,如果你想为用户建立一次会话,可以在用户授权成功时给他一个唯一的cookie。当一个用户提交了表单时,浏览器会将用户的SessionId自动附加在HTTP头信息中(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionId所对应的用户。试想,如果没有 SessionId,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。 - Cookie和session有什么区别
- Cookie:由于cookie是由客户端浏览器保存和携带的,所以称之为客户端技术。只能存字符串。Session是一个域对象,放在服务器端,可以存对象。
- Cookie安全性不够,由于cookie存储在客户端,其他人可以很容易的拿到存放在本地的cookie,并进行cookie诈骗。Session信息保存在服务器端,因此比较安全。
- Cookie性能更高一些,由于session会在一定时间内保存在服务器上,因此当访问量增多时,会降低服务器的性能。
- 单个cookie保存的数据不能超过4KB,很多浏览器都限制一个站点最多保存20个cookie,而session不存在此问题。
通常将用户登录等重要信息存放在session中,其他需要保留的信息可以放在cookie中。
七、Https如何保证了数据的安全?
http协议:
-
通信使用明文不加密,内容可能被窃听,也就是被抓包分析
-
不验证通信方身份,可能遭到伪装
-
无法验证报文完整性,可能被篡改
Https就是Http加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
-
Http为何不安全?
http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持、监听、篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题。比如常见的,在http通信过程中,“中间人”将广告链接嵌入到服务器发给用户的http报文里,导致用户界面出现很多不良链接;或者是修改用户的请求头URL,导致用户的请求被劫持到另外一个网站,用户的请求永远到不了真正的服务器。这些都会导致用户得不到正确的服务,甚至是损失惨重。 -
HTTPS的加密过程:
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是又不能所有客户端与服务器之间都使用同一个加密算法,所以需要服务端必须和客户端去协商我们该使用那个算法。协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,协商的过程是没有加密的,还是会被中间人拦截,所以我们再对这个协商过程采用非对称加密算法进行对称加密。在这个过程中会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
八、.Http协议中Http1.0和1.1区别?
在http1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,当浏览器下次请求的 时候又要建立连接,显然这种不断建立连接的方式,会造成很多问题。
在http1.1中,可以建立长效连接。