@



Cookie介绍


Cookie的由来

大家都知道HTTP协议是无状态的.

无状态的的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况.

人生只如初见,对于服务器来说,每次的请求都是全新的.

状态可以理解为客户端和服务器在某次会话中产生的数据.

无状态就可以理解为这些数据不会被保留.

会话中产生的数据又是我们需要保存的,也就是说要"保持状态",因此Cookie就在这样一个场景下诞生了.


什么是Cookie

Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对。下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用的信息.

Cookie本身最大支持4096字节.


Cookie的原理

有服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是"谁"了.


查看Cookie

我们使用Chrome浏览器,打开开发者工具:



操作Cookie


获取Cookie

def login(request):
# 获取Cookie:
ret = request.COOKIES['user']
# ret = request.COOKIES.get('user')
# request.get_signed_cookie(key, salt='user', default='')
# request.get_signed_cookie('user', default=RAISE_ERROR, salt='', ax_age=None)
return render(request, 'login.html')

get_signed_cookie方法的参数:

  • default:默认值
  • salt:加密盐
  • max_age:后台控制过期时间

设置 Cookie

def test(request):
rep = HttpResponse('is ok')
# 设置Cookie:
rep.set_cookie('user', 'zyk')
# rep.set_signed_cookie('user', 'zyk', salt="加盐")
return rep

查看设置的Cookie,如图:

set_cookie方法的参数:

  • key:键.
  • value='':值.
  • max_age=None:超时时间.
  • expires=None:指定IE浏览器超时时间(IE requires > expires, so set it if hasn't been already.).
  • path='/':Cookie生效的路径,/表示跟路径,特殊的:跟路径的cookie可以被任何url的页面访问.
  • domain=None:Cookie生效的域名
  • secure=False:https传输
  • httponly=False:只能http协议传输,无法被JavaScript获取(也不是绝对,底层抓包可以获取到也可以被覆盖).

删除Cookie

def test(request):
rep = HttpResponse('is ok')
# 删除Cookie:
rep.delete_cookie('user')
return rep

Cookie版登陆校验:

from django.shortcuts import render, redirect, HttpResponse
from blog01 import models # 装饰器函数
def login_required(fn):
"""如果未登陆,将返回login页面"""
def inner(request, *args, **kwargs):
print(request.COOKIES.get('is_login'))
if request.COOKIES.get('is_login') != '1':
# 获取当前url路径
next = request.path_info
return redirect('/login/?next=%s' % next)
ret = fn(request, *args, **kwargs)
return ret
return inner # 登陆功能
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if models.Userinfo.objects.get(name=user, pwd=pwd):
# 提取跳转之间访问的页面
next = request.GET.get('next')
rep = redirect(next) if next else redirect('/home/')
# 设置Cookie, max_age=1:指定过期时间为1秒
rep.set_cookie('is_login', '1', max_age=1)
return rep
return render(request, 'login.html') @login_required
def home(request):
return HttpResponse("我是home页面") @login_required
def home01(request):
return HttpResponse("我是home01页面")

最新文章

  1. C#获取本机公网IP
  2. Linux 下从头再走 GTK+-3.0 (四)
  3. Android Fresco (Facebook开源的图片加载管理库)
  4. 在某个目录下的所有文件中查找包含某个字符串的Windows命令
  5. poj 3295 Tautology
  6. Unity3d开发wp8问题汇总
  7. 从零单排Linux – 2 – 目录权限
  8. DataGridView 绑定数据后修改列类型
  9. VC下载文件显示进度条
  10. UCOS 内存管理理解 创建任务
  11. 聪明的kk
  12. 初学者易上手的SSH-struts2 02Action获取表单数据-通配符
  13. [react] React 新手必须知道的 N 件事
  14. 浅谈Java反射
  15. Linux常用命令详解(week1_day1_1)--技术流ken
  16. JavaScript-BOM与DOM
  17. (注意输入格式)bistuoj(旧)1237 成绩统计
  18. struts与servlet共存
  19. (转载)new Thread的弊端及Java四种线程池的使用
  20. el-container 实践上的布局问题

热门文章

  1. MapReduce中combine、partition、shuffle的作用是什么
  2. elasticsearch中的几个概念总结
  3. Centos7+httpd+fastcgi+rails安装
  4. hdoj--1869--六度分离(floyd)
  5. rest_framework 认证功能
  6. SVN冲突的解决过程
  7. <Three.js>(第二节)添加长方体
  8. 用 while 循环做个小游戏
  9. Nginx的日志管理
  10. Win10 + YOLOv3 环境配置,编译,实现目标检测----How to compile YOLOv3 on Windows