cookie与session关系
cookie 是保存在客户端浏览器的键值对,浏览器发送请求时候会自动携带。 session 1、生成随机字符串 2、回给浏览器,让它写到cookie # {"sessionID":"234asd243dv35fd"} 3、自己保留一份,作为一个key,存到一个地方,key后面对应一个保存用户相关信息的键值
session-key session-data
234asd243dv35fd {"user":"alex"
概念
cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie因此诞生
cookie工作原理
用户在浏览器登录后,服务端根据用户的登录信息生成键值对(也就是cookie),保存用户的个人信息,然后将键值对返回给浏览器,浏览器保存在本地。当浏览器再次访问时,就会自动将这个键值对(cookie)带上,这样服务端就能通过cookie的内容判断这个用户是谁了。
cookie虽然在一定程度上解决了保持状态的需求,但由于cookie本身最大支持4096字节的数据,以及cookie本身是明文保存在客户端,很容易被拦截或窃取。因此就需要一种能够支持保存更多数据,并且保存在服务端,且具有较高安全性的机制,这就是session。
session工作原理
session是基于cookie工作的
- 用户登录后,服务端随机生成一个字符串,将这个随机字符串作为键值对(cookie)的value,而键值对的key则是由Django的session配置中自定义,默认情况下是sessionid,组成的cookie就{'sessionid':'xxxxxxxxxx'},服务端将这个cookie返回给浏览器,这样,浏览器本地只保存着一个随机字符串;
- 服务端再将第1步中生成的随机字符串做为key,由用户信息产生的字典做为value,组成一个键值对,保存在服务器端;假设随机字符串是"abc123",那组成的键值对理论上类似这样:{'abc123'{'login':true,'username':'jassin'}}
- 下次用户访问时,浏览器带着cookie,服务端根据cookie中的随机字符串就可以找到对应的用户信息了。
session的好处:浏览器端只存在一个随机字符串,避免用户信息被直接暴露在外。
from django.shortcuts import render from app01 import models def login(request): # 记录日志 if request.method == 'GET': pass else: user = request.POST.get('user') pwd = request.POST.get('pwd') obj = models.UserInfo.objects.filter(user=user,pwd=pwd).first() if obj: # 用户名和密码正确 """ { “xxxx的随机字符串”:{'id':1,'name':'jassin'}, “xx的随机字符串”:{'id':11}, } 表: session_key value xxxx的随机字符串 asfasdfasdfasdfwer2342fszdfsdfs 1. 生成随机字符串 2. 把随机字符串写到客户端浏览器cookie中 3. 在内存中大字典写入: { 随机字符串: {'id':用户id} } """ request.session['id'] = obj.id request.session['name'] = obj.name else: # 用户名和密码错误 pass def home(request): """ :param request: :return: """ """ 1. 获取客户端cookie中的随机字符串 2. 如果有: 则获取 key 对应的值 否则 返回None """ user_id = request.session.get('id') def temp(request): data_list = { 'k1':'sf4sdf' } return render(request,'temp.html',data_list)
Django实现的cookie
获取Cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间