状态保持全景笔记之cookie
【摘要】 状态保持全景笔记之cookie 一、为什么需要状态保持HTTP 协议本身是无状态的:每次请求结束,服务器立即关闭 socket 并销毁进程上下文;下一次请求,服务器完全不记得你是谁、看过什么商品、是否登录。因此,为了让“服务器记住你”,必须人为在客户端或服务器端保存会话标识。 二、两种主流实现方案数据存放位置生命周期典型用途优缺点Cookie浏览器本地文本文件浏览器控制(默认会话级,可设过...
状态保持全景笔记之cookie
一、为什么需要状态保持
HTTP 协议本身是无状态的:
-
每次请求结束,服务器立即关闭 socket 并销毁进程上下文;
-
下一次请求,服务器完全不记得你是谁、看过什么商品、是否登录。
因此,为了让“服务器记住你”,必须人为在客户端或服务器端保存会话标识。
二、两种主流实现
方案 | 数据存放位置 | 生命周期 | 典型用途 | 优缺点 |
---|---|---|---|---|
Cookie | 浏览器本地文本文件 | 浏览器控制(默认会话级,可设过期) | 记住用户名、购物车 | 轻量,但有大小/数量限制 |
Session | 服务器内存/Redis/数据库 | 服务器控制(默认 30 min 无操作失效) | 登录态、敏感权限 | 安全,但服务器压力大 |
三、Cookie 完整生命周期(以用户名登录为例)
- 首次请求
GET /login/?username=alice&password=123 HTTP/1.1
服务器收到后:
response = HttpResponse('登录成功')
response.set_cookie('uid', 1001, max_age=3600) # 有效期 1h
return response
浏览器接收,把 uid=1001
写入本地 Cookie 文件。
- 后续请求
浏览器自动在请求头里带上:
GET /cart/ HTTP/1.1
Cookie: uid=1001
服务器即可通过 request.COOKIES['uid']
识别为 Alice。
四、Django 代码演练(5 行搞定)
# views.py
def set_cookie(request):
resp = HttpResponse("已给你种下 cookie")
resp.set_cookie('username', 'alice') # 写入
return resp
def get_cookie(request):
name = request.COOKIES.get('username', '游客')
return JsonResponse({'welcome': name})
cookie有效期
设定方式 | 示例 | 结果 |
---|---|---|
不设置 | response.set_cookie('uid','1001') |
会话级——浏览器关闭即失效 |
秒级 | response.set_cookie('uid','1001',max_age=3600) |
从当前响应开始计时 3600 秒后过期 |
绝对时间 | response.set_cookie('uid','1001',expires='2025-12-31') |
指定绝对日期 |
cookie多值写法
Cookie 只能存字符串,多值用多次调用:
response.set_cookie('uid', '1001')
response.set_cookie('pwd', '123456')
或使用 json.dumps
把字典转成字符串:
import json
response.set_cookie('info', json.dumps({'name':'alice','age':18}))
删除 Cookie
response.delete_cookie('uid') # 等价于把 max_age 设为 0
五、完整视图模板
def set_cookie(request):
resp = HttpResponse('已种下 cookie')
resp.set_cookie('username', 'alice', max_age=3600) # 1 小时
return resp
def get_cookie(request):
name = request.COOKIES.get('username', '游客')
return HttpResponse(f'欢迎回来:{name}')
六、调试口诀
“服务器写,浏览器存,下次请求自动带;域名隔离别乱猜,秒级/绝对时间任你改。”
五 面试/开发高频点
-
Cookie 大小:单条 ≤ 4 KB,单域名 ≤ 20 条。
-
跨域限制:
Domain
与Path
属性决定 Cookie 作用范围。 -
安全标志:
HttpOnly
防 XSS,Secure
防中间人。 -
集群 Session:把 Session 存 Redis,实现多台 Web 节点共享。
六、一句话总结
“HTTP 天生健忘,Cookie 负责把身份证揣在浏览器兜里,Session 负责把档案袋锁在服务器柜子里。”
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)