1.无连接
就是每次连接只处理一个请求,当服务器处理完客户的请求,并收到客户的应答后就会断开连接,这种方式可以节省传输的时间。
HTTP1.0协议默认是无连接的,由于不符合现代互联网的网络传输特点,故已在HTTP1.1标准中默认将Connection设置为了Keep-Alive
Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
只要任意一端没有明确提出断开连接,则将一直保持 TCP连接状态。
2.无状态性
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送响应数据回来。但是发送完后不会记录任何信息。
# http无状态,两个网址是独立的,不能成功登录
def func7():
data = {
'username': 'admir',
'password': '1234'
}
requests.post('http://localhost:8080/mms/Login/loginUser',data = data)
resp = requests.get('http://localhost:8080/mms/Login/GetLoginName')
print(resp.text)
-
优势:不需要消耗资源记录客户端状态信息,可以把更多资源用于提供服务。
-
劣势:对于客户端有关联性的操作时会非常麻烦。
目前常见的解决手段是cookie. session和token
-
Session:服务器用于保存客户端信息的“一 堆数据",每个session会有一 个session id, 这个id会被发送给客户端进行保存。session具有时效性,过期就失效了。
"""
利用session对象保持会话状态
"""
def func14():
session=requests.Session() # 创建一个session对象
#在接口测试项目中,所有需要在登陆后接口请求,必须使用sessio对象来发送请求
session.post('http://localhost:8080/mms/Login/GetLoginName')# 创建一个session对象
data={
'username':'admir',
'password':'1234'
}
# http无状态,是独立的,不能成功登录
session.post('http://localhost:8080/mms/Login/loginUser',data=data)
resp=session.get('http://localhost:8080/mms/Login/GetLoginName')#获取登录信息--->request返回的是http无状态性
print(resp.text)
- Cookie
一个具体的文本文件,由服务器生成,但保存在客户端。在客户端第一次请求后服务器会下发一个装有客户信息的“小贴纸”,后续客户端请求服务器的时候,带上这个“小贴纸",服务器就知道客户端的信息了。
"""
在请求头中添加cookie信息 主要通过cookie绕过登录获取登录后的数据,cookie会过期
cookie容易失效,就无法获取登录后的信息,不推荐使用,临时登录可用
"""
def func6():
headers={
'Cookie':'JSESSIONID=F411C3F3038366FCE12226690D3E5A51'
}
resp=requests.get('http://localhost:8080/mms/Login/GetLoginName',headers=headers)
print(resp.text)
服务器保存的session多了,资源有限的情况下就需要做扩充,比如基于为服务的服务集群如何去保持登录?
- token:
这时候就需要服务器生成的数字签名,保存每个登录成功的信息,经过特殊加密后的一串字符。不管token签名发给那一台服务器都会通过解密验证登录。
- 用户通过用户名和密码进行登陆校验。
- 服务器验证,如果验证通过则返回一个服务器端签名的token给客户端。
- 客户端储存token,并且每次用于每次发送请求。
- 服务端验证token并返回数据。