状态保持全景笔记之cookie

举报
周杰伦本人 发表于 2025/08/31 20:38:36 2025/08/31
【摘要】 状态保持全景笔记之cookie 一、为什么需要状态保持HTTP 协议本身是无状态的:每次请求结束,服务器立即关闭 socket 并销毁进程上下文;下一次请求,服务器完全不记得你是谁、看过什么商品、是否登录。因此,为了让“服务器记住你”,必须人为在客户端或服务器端保存会话标识。 二、两种主流实现方案数据存放位置生命周期典型用途优缺点Cookie浏览器本地文本文件浏览器控制(默认会话级,可设过...

状态保持全景笔记之cookie

一、为什么需要状态保持

HTTP 协议本身是无状态的:

  • 每次请求结束,服务器立即关闭 socket 并销毁进程上下文;

  • 下一次请求,服务器完全不记得你是谁、看过什么商品、是否登录。

因此,为了让“服务器记住你”,必须人为在客户端服务器端保存会话标识

二、两种主流实现

方案 数据存放位置 生命周期 典型用途 优缺点
Cookie 浏览器本地文本文件 浏览器控制(默认会话级,可设过期) 记住用户名、购物车 轻量,但有大小/数量限制
Session 服务器内存/Redis/数据库 服务器控制(默认 30 min 无操作失效) 登录态、敏感权限 安全,但服务器压力大

三、Cookie 完整生命周期(以用户名登录为例)

  1. 首次请求
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 文件。

  1. 后续请求
    浏览器自动在请求头里带上:
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 条。

  • 跨域限制DomainPath 属性决定 Cookie 作用范围。

  • 安全标志HttpOnly 防 XSS,Secure 防中间人。

  • 集群 Session:把 Session 存 Redis,实现多台 Web 节点共享。

六、一句话总结

“HTTP 天生健忘,Cookie 负责把身份证揣在浏览器兜里,Session 负责把档案袋锁在服务器柜子里。”

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。