cookie、session和jwt
cookie与session的区别
由于http是一种无状态协议,无法保持一种会话的状态,所以可以使用cookie和session保持会话的状态
-----cookie
保存在用户浏览器端的键值对,cookie是由服务端创建的并将其发送给客户端浏览器。以后每次客户端向该服务端发送请求时,都携带该cookie。

服务端获取请求的cookie
tk = request.COOKIES.get('ticket')
服务端写给客户端的cookie
obj2 = redirect('/classes/')
obj2.set_cookie('ticket','33ads4sdcedcz3da')
#set_cookie的用法
def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None):
max_age表示cookie生效时间,单位是秒
expires表示cookie生效日期,与max_age类似,单位不同
path表示cookie在哪个url中生效,默认是/,表示所有页面生效
domian表示在域名中生效,如果填写的是顶级域名,则下面的子域名cookie也会生效,如果填写子域名,则其他子域名不会生效。默认当前域名
httponly设置后,只有通过http传输中传入,JS代码无法获取
secure,用来设置https
加密cookie
def set_signed_cookie(self, key, value, salt='', **kwargs): value = signing.get_cookie_signer(salt=key + salt).sign(value) return self.set_cookie(key, value, **kwargs)
其中salt表示加言
获取加密的cookie
request.get_signed_cookie()
----session
session是保存在服务器端的数据(本质是一对键值对),当用户请求时,将这一个随机的字符串作为key,写入到cookie中,然后再在内存中保存这个key,其value保存这个用户的唯一凭证,等下次用户在请求时,携带这个随机字符串的cookie,服务器在进行比对。这样敏感信息不发给用户,更加安全
django的session的配置
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
session可以存放在很多地方,通过引擎设置
数据库:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
文件:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
缓存:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
缓存+数据库:
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
优先去缓存拿,如果没有,就去数据库拿
from django.shortcuts import render,redirect,HttpResponse # Create your views here. def session(request): if request.method == 'GET': return render(request,'session_login.html') else: user = request.POST.get('username') pwd = request.POST.get('pwd') print(user,pwd) if user == 'alex' and pwd == '123': # 生成随机字符串 # 通过cookie发送给客户端 # 服务端保存(django实际是保存到数据库中) #随机字符串的键值为 # { # 随机字符串:{'username':'alex','pwd':'123','email':'1060924543@qq.com'} # } request.session['username'] = 'alex' request.session['pwd'] = '123' request.session['email'] = '1060924543@qq.com' return redirect('session_index.html') else: return render(request, 'session_login.html',{'msg':'账号密码错误'}) def index(request): # 获取客户端发过来cookie中的随机字符串 # 在session中查找有没有这个随机字符串 # 去session中查找对应这个随机字符串key的value中是否有username,或者查看这个username是否有alex,如果有,则表示已经登录 v = request.session.get('username') if v: return render(request,'session_index.html') else: return render(request, 'session_login.html', {'msg': '账号密码错误'})
------jwt
pip install pyjwt,jwt
cookie的缺点,cookie容易被伪造或者查看,session的缺点,如果用户量大,session的存储压力会很大,而jwt的作用是在cookie里写入一个只能由服务器认识的一个了令牌。
JSON web token是一个符合json标准,在web领域的一种令牌,一般用来在身份提供者和服务提供者间传递认证的用户身份信息,便于从服务器获取资源。
from jwt import PyJWT
from django.conf import settings import jwt def tokens(request): if request.method == 'POST': data = request.body data = json.loads(data) md5 = hashlib.md5() md5.update(data['password'].encode()) try: result = models.UserProfile.objects.get(username=data['username']) print(result) except Exception as e: return JsonResponse({'code':400, 'error':'用户名不存在,请先注册'}) if md5.hexdigest() != result.password: return JsonResponse({'code': 401, 'error': '账号密码错误'}) else: token = make_token(data['username']) return JsonResponse({'code': 200, 'username': data['username'], 'data': {'token':token.decode()}}) #由于token里面既有字符串也有字节串,所以需要统计decode,将其转为字符串 def make_token(username,exp=3600*24): key = settings.JWT_TOKEN_KEY now_time = time.time() payload_data = {'username':username,'exp': now_time+exp} return jwt.encode(payload_data, key, algorithm='HS256')
settings中配置jwt的key
JWT_TOKEN_KEY = '123456' #定义jwt的key

浙公网安备 33010602011771号