一,理论知识
为什么有cookie和session?

因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性

·cookie
cookie是服务器发送到用户浏览器并保存到用户本地的一小块数据,会在浏览器再下次向同一服务器再发起请求时被携带并发送到服务器上。通常用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。

原理:
Cookie技术会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。

② 客户端再向服务器端发送请求的时候,客户端会在请求报文中加入Cookie值后发送出去。服务器端会检查客户端发送的请求中有没有Cookie值,然后对比服务器上的记录,最后确定是哪一个客户端,之前的信息状态是什么


·session
session 是一种在服务端记录用户信息的技术,在http无状态协议下,服务端记录用户状态时用于标识具体用户的机制,是在服务端保存的用来追踪用户状态的数据结构(键值对),可以保存在文件,数据库或者集群中

Session是存放在服务器端、用来存放用户数据的(类似于HashTable结构)。

当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。

当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable,以此来达到共享数据的目的。

 


二、cookie和session的区别

1,存储位置不同,cookie是将用户数据通过加密的方式存储在客户端(大多数在浏览器),session存储在服务器(用于控制客户端和服务端的连接)

2,存储容量不同,cookie只能发ASCII码,通过编码的方式获取Unicode字符,或者二进制数据,不能存复杂数据,session能存任何类型的数据。

3,安全性,隐私策略不同,cookie放在客户端,可以进行cookie欺骗,session放在服务端,比较安全

4,有效期不同,cookie实际上可以设置属性,达到长期有效(记住历史登录),(expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。)

session依赖于JSESSIONID的cookie,JSESSIONID过期时间默认为-1,即关闭窗口就失效,可以设置时间,但是超时时间太长,容易造成内存溢出,

5,对服务器的压力不同,cookie保存在本地,不存在服务器压力,session保存在服务端,每个用户都会产生一个session,当访问增多,会比较占用服务器的性能,如果主要考虑减轻服务器性能压力,应使用cookie。


  python接口自动化中对cookie和session的处理方式
在python中,有专门的一个类来处理cookie和session,即Session类。类似于jmeter的cookie管理器。


import requests  # 导入request

s = requests.Session()  # 实例化一个request.Session类的对象

print("登陆之前的cookies:",s.cookies)  # 与登录之后的cookie对比,一开始为空,后面登录后,就获取到了cookie

 

login_url = "https://www.ketangpai.com/UserApi/login"

login_datas = {"email":"198658759##",

             "password":"sdk93#####",

             "remember":0}

 

resp = s.post(login_url, data=login_datas)  # 发送post请求,登录,获取cookie,会自动添加到s对象中,后续接口请求要用到cookie,直接使用即可

print("登陆之后的cookies:",s.cookies) # 主动会将响应的set-cookies添加到s对象当中。

print(resp.json())

 

userinfo_url = "https://www.ketangpai.com/UserApi/getUserInfo"  # 发送请求,获取用户信息,验证是否自动带上了cookie

resp1 = s.get(userinfo_url)

print(resp1.json())