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, Anyclass TokenManager:def __init__(self, login_url: str, username: str, password: str):"""初始化Token管理器。:param login_url: 登录接口URL:param username: 用户名:param password: 密码"""self.login_url = login_urlself.username = usernameself.password = passwordself.token: Optional[str] = Noneself.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_intervalreturn {"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.tokendef 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)