【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session

快速导航

  • 前言
  • 一、HTTP协议中GET和POST
    • 1. get比post快
    • 2.get是安全幂等性的
    • 3.get/post本质都是TCP连接
  • 二、COOKIE和SESSION
    • 1、cookie和session的关系
    • 2、cookie机制
    • 3、session
  • 三、总结

前言

【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第1张图片
今天是一年一度“1024”程序员节,各位大佬节日快乐,继续码!!

本篇主要总结的就是HTTP的应用,HTTP是应用层的协议,本质是基于传输层的TCP协议实现的,在此基础上进行一个完整包装,就是用于网络传输的协议标准了。
【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第2张图片
在我们浏览网站、登录的操作中,就涉及到HTTP的数据传输,get和post就是最基本的动作。不过,get和post的特点有哪些、有什么区别,估计能回答一二,而更具体的内容,你还知道哪些呢?
【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第3张图片
另外,HTTP是无状态协议,如何记住用户的登录状态呢?**cookie和session,**就是其中的解决方案。

一、HTTP协议中GET和POST

1. get比post快

get耗时为post的2/3,看一看它们的工作过程就明白了。

post请求过程

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器答应进行tcp连接(第二次握手)
  3. 浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
  4. 服务器返回100 continue响应
  5. 浏览器开始发送数据
  6. 服务器返回200 ok响应

【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第4张图片

这里可见,post的工作过程是完成三次握手之后,才进行数据的传输,post请求的目的大多数是提交表单数据。第3和4步更好地验证数据的完整性

再来看看get请求过程。

get请求过程

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器答应进行tcp连接(第二次握手)
  3. 浏览器确认,并发送get请求头和数据
  4. 服务器返回200 ok响应

【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第5张图片
get操作主要用来获取数据,然后呈现给用户。它确认服务器连接之后,第三步就开始传输数据了。

现在从get和post的请求过程看,post需要6步完成,get需要4步完成。

因此,get耗时大概为post的2/3

2.get是安全幂等性的

安全是指不会修改数据。这里的安全并不是指数据传输过程中的安全。

幂等性意味着对同一URL的多个请求应该返回同样的结果,用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

  • 比如,数学中的幂等函数:绝对值,abs(x) = abs(abs(x))

  • 日常应用中的幂等:线上支付。

  • 分布式中的幂等:kafka数据提交的幂等性。

3.get/post本质都是TCP连接

只是在HTTP的规定各种浏览器/服务器的限制,才出现在应用中有所不同。

前面是HTTP的基本操作,在客户端/浏览器与服务器的通信中GET和POST的特点和区别。

HTTP是无状态协议,一次GET或者POST之后,两边就此结束刚刚的通信状态,请求和响应状态都不会保存下来。
【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第6张图片
当我们浏览商品网站,准备购买商品,会登录账号,选择一件商品,正要点击下单,但是说了HTTP是无状态的.

下单这个操作如何正确识别是哪个用户呢

如何记住用户的登录状态呢?cookie和session,就是其中的解决方案。

二、COOKIE和SESSION

1、cookie和session的关系

由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别用户身份,这个机制就是session

因此,服务端要为特定的用户创建特定的session用于标识这个用户,并且跟踪用户行为。

在上面购买商品的例子中,服务端会创建该用户的session,保持会话状态。而在服务端的实现,则是将session保存在,缓存内存或数据库等。

说到这里,服务端到底是如何知道用户特点,来进行标识呢?——这就引申出cookie机制HTTP状态管理机制

【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第7张图片

2、cookie机制

先来看看HTTP的首部字段信息,包含用户的信息。

首部名称 类型 描述
From 请求 用户email地址
User-Agent 请求 用户的浏览器软件(名称+版本)
Referer 请求 从页面链接跳转过来的
Authorization 请求 用户名和密码
Client-IP 扩展(请求) 客户端IP地址
X-Forwarded-For 扩展 客户端IP地址
Cookie 扩展 服务器产生的ID标签

由此看出,首部的这些字段信息,目的都是来标识一个用户,保证服务端可以识别身份信息。

Client IP(客户端IP)为例,早期可以作为一种标识使用,前提保证每个用户都有不同的IP地址。

现在,这种方法肯定不可行,识别用户存在许多缺点:

  1. IP地址是标识机器的,如果多个用户使用同一台机器,则无法区分。
  2. ISP动态分配IP地址,每次登录得到不同的地址。
  3. 为了提高安全性,并对稀缺的地址资源进行管理,都会通过NAT防火墙隐藏实际IP地址,转换为一个共享的防火墙IP地址。
  4. 客户端通过会经过网关、代理服务器,Web服务器得到的不是客户端IP地址。

cookie,实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。

当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

cookie信息

  1. Set-Cookie:一个的cookie名和cookie值。

  2. Expires:可选的。过期时间。

  3. Domain:指定域。如baidu.com,至少包含二级域名,避免出现.com、.cn、.org

  4. Path:URL后面指定路径,例如'/'匹配域名下所有内容,/list匹配list下的内容

  5. Secure:说明只有在HTTP使用SSL安全连接时才会发送cookie。

Java中把Cookie封装成了javax.servlet.http.Cookie类。主要的属性和方法如下表格:

Cookie cookie = new Cookie("username","hello");// 新建Cookie

cookie.setMaxAge(Integer.MAX_VALUE);// 设置失效时间

cookie.setPath("/list/"); //设置路径

cookie.setSecure(true);//设置安全性

response.addCookie(cookie);// 添加发送到客户端
属 性 名 描 述
String name Cookie的名称。Cookie一旦创建,名称便不可更改
Object value Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge Cookie失效的时间单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1。
boolean secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
String comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

另外,cookie中设置了HttpOnly属性,js脚本将无法读取到cookie信息,这样能有效地防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性。

response.setHeader( "Set-Cookie" , "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

3、session

Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

对比之下,cookie像是个人身份证,session像是档案表

Java中的javax.servlet.http.HttpSession类

HttpSession session = request.getSession();// 获取Session对象

session.setAttribute("loginTime", new Date());// 设置Session中的属性

总结下来,cookie和session的特点是:

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息(账号密码、sessionID),也是实现Session的一种方式

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在缓存集群、数据库、文件中。


三、总结

这一篇总结的内容就是HTTP的基本操作GET和POST的详细特点,HTTP的无状态性,使得在get/post之后,没有记录会话状态,因此,引申出cookie和session的解决方案。

阅读之后,相信会有所收获,更好地梳理了这部分知识,面试时候如行云流水,offer++!

【快速学习系列,图文并茂】HTTP的GET和POST、Cookie和Session_第8张图片

如果觉得不错欢迎“一键三连”哦,点赞收藏关注,评论提问建议,欢迎交流学习!一起加油进步,我们下篇见!


本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/120931996

你可能感兴趣的:(计算机网络,1024程序员节,http,网络,session,cookie)