Session和Token的区别
在Web应用和身份验证系统中,二者是用于管理用户状态和身份验证的两种常用机制。
Session是一种服务端存储用户状态的机制。当用户登录后,服务器会为该用户创建一个唯一的Session ID,通常存储在服务器的内存或数据库中。并通过Cookie或URL参数将Session ID发送给客户端。
其特点如下:
- Session ID是用户与服务器之间的唯一标识;
- 用户的状态信息(如登录状态、用户权限等)存储在服务端;
- 客户端只需要保存Session ID,无需存储敏感信息;
Token为一种客户端存储用户身份信息的机制。用户登录后,服务器会生成一个包含用户身份信息的Token,并将其发送给客户端。客户端在后续请求中携带该Token,服务器通过验证Token来确认用户身份。
其特点如下:
- Token包含用户身份信息(如用户ID、权限等),通常经过加密或签名。
- Token存储在客户端(如Cookie、LocalStorage、Header等)。
- 服务器无需存储用户状态,只需验证Token的有效性。
TOKEN获取代码示例:
import requests
import time
from typing import Optional, Dict, Any
class TokenManager:
def __init__(self, login_url: str, username: str, password: str):
"""
初始化Token管理器。
:param login_url: 登录接口URL
:param username: 用户名
:param password: 密码
"""
self.login_url = login_url
self.username = username
self.password = password
self.token: Optional[str] = None
self.token_expires_at: Optional[float] = None # Token过期时间戳
self.refresh_interval: int = 300 # 提前刷新Token的时间(秒),避免过期
def _fetch_token(self) -> Dict[str, Any]:
"""
从登录接口获取Token。
:return: 包含Token和过期时间的字典
"""
login_data = {
"username": self.username,
"password": self.password
}
response = requests.post(self.login_url, json=login_data)
print(f"响应报文为:{response.text}")
if response.status_code == 200:
data = response.json()
self.token = data["data"]["access_token"]
# 假设API返回Token的过期时间(单位:秒)
expires_in = data.get("expires_in", 3600) # 默认1小时过期
self.token_expires_at = time.time() + expires_in - self.refresh_interval
return {"token": self.token, "expires_at": self.token_expires_at}
else:
raise Exception(f"登录失败,状态码: {response.status_code}, 错误信息: {response.text}")
def get_token(self) -> str:
"""
获取当前有效的Token,如果Token过期则自动刷新。
:return: 有效的Token
"""
if self.token is None or time.time() >= self.token_expires_at:
self._fetch_token()
return self.token
def refresh_token_if_needed(self) -> None:
"""
检查Token是否需要刷新,如果需要则刷新。
"""
if self.token is None or time.time() >= self.token_expires_at:
self._fetch_token()
if __name__ == "__main__":
token_manager = TokenManager(
login_url="https://skawms.sit.sf-express.com/api/sys/login",
username="01369530",
password="LF5/N2uYvtjjXWAO1ny8EBD1Df0pnUoFu5brpRONKXpru9/xQwSb+etPxY1r1RRlKUap8DrJa0Bw6jcUqyNu4tOuFIvXCjo2GjXkvK4UvYISl3XLKEaRkV96SMEu0ZW1bXWMynPu0Z5iF7qvZ457oMGDWP54VA/wnPmPsnYPtEU="
)
token = token_manager.get_token()
print("Token:", token)