HTTP协议的无状态(Stateless)特性是指:服务器不会保留客户端请求之间的任何状态信息。每个HTTP请求都是完全独立的,服务器不会记住之前的请求信息。
日常比喻:就像自动售货机:
GET /page1 HTTP/1.1
Host: www.example.com
(服务器响应后立即忘记这次请求)
GET /page2 HTTP/1.1
Host: www.example.com
(服务器不知道这是同一个用户的连续请求)
客户端 服务器
|--请求1-->|
|<-响应1--|
|--请求2-->| (请求2与请求1无关联)
|<-响应2--|
优点 | 说明 |
---|---|
服务器简单 | 不需要维护会话状态 |
高扩展性 | 容易实现负载均衡 |
降低内存消耗 | 不存储客户端上下文信息 |
故障恢复快 | 单次请求失败不影响后续操作 |
无状态
用户登录
添加商品到购物车
结算
服务器知道用户身份吗?
无法完成流程
// 服务器设置Cookie
response.setHeader('Set-Cookie', 'sessionID=abc123; Path=/');
// 客户端后续请求自动携带
const cookie = request.headers.cookie; // sessionID=abc123
# Django示例
def login(request):
request.session['user'] = 'john_doe'
# 服务器会存储session数据并设置session cookie
def profile(request):
user = request.session.get('user')
return HttpResponse(f'Hello {user}')
JWT结构示例:
header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
方案 | 存储位置 | 安全性 | 扩展性 | 适用场景 |
---|---|---|---|---|
Cookie | 客户端 | 中等 | 高 | 传统Web应用 |
Session | 服务端 | 高 | 低 | 服务器集群需共享 |
JWT | 客户端 | 依赖实现 | 高 | 分布式系统/API |
// React Context示例
const AuthContext = createContext();
function App() {
const [user, setUser] = useState(null);
return (
<AuthContext.Provider value={{ user, setUser }}>
{/* 应用组件 */}
</AuthContext.Provider>
);
}
用户浏览器
├── LocalStorage(持久化存储)
├── Redux Store(应用状态)
└── HTTP Only Cookie(安全凭证)
服务器集群
├── Redis(分布式Session存储)
└── 无状态业务服务
A:协议本身无状态,但可以通过各种技术手段实现有状态的应用逻辑
A:REST架构严格遵循无状态约束,所有请求必须包含完整上下文
考虑因素: