cookie与session操作
cookie与session操作
一、cookie与session简介
1、cookie简介
由于http请求是无状态的,无法记录用户的身份,所以需要有一种机制来长期的保存和校验用户的身份,最先出现的是cookie
cookie:是由服务器下发到用户(浏览器)本地用于校验身份的数据(键值对)
cookie工作机制:
当第一次登陆成功之后,服务端返回一个随机字符串(cookie)保存在客户端浏览器上,之后再次朝服务端发送请求,只需要携带该随机字符串,服务端就能够识别当前用户身份
由于cookie是由服务器下发到用户本地的,所以导致了一些安全性问题:
- 用户可以拒收cookie
- 用户可以仿造cookie
2、session简介
session就是为了解决cookie的安全性问题提出的一种新的回话控制技术,session的使用依赖于cookie
session存放在服务器的数据库(django_session表)
django中默认的session超时时间为14天
使用session之后,不会再次直接向服务器下发cookie身份信息,下发的是一个随机不重复的session_id,用户携带session_id访问服务器,服务器通过session_id判断身份,下发cookie。再次校验
服务器校验的内容有:
- session和cookie是否对应
- session是否过期
- cookie是否合法
3、cookie和session对比
cookie放在用户本地,session存在服务器数据库当中
校验cookie速度比较快,但安全性不够好
校验session速度比较慢,安全性相对好
二、cookie操作
1、设置cookie
# obj = render() # obj = redirect() obj.set_cookie(key, value) # 设置键值对{key: value} return obj
后端views.py代码:
def index2(request): obj = HttpResponse("it's index2.html") obj.set_cookie('key', 'value') # 传入的前两个参数是cookie键值对 return obj
2、获取cookie
request.COOKIES.get('key') # cookie键值对取值
request.path_info # 只拿根路径部分
request.get_full_path() # 拿全路径,路径加参数
后端views.py代码:
def index2(request): obj = HttpResponse("it's index2.html") obj.set_cookie('key', 'value') # 传入的前两个参数是键值对 print(request.COOKIES.get('key')) # cookie键值对取值 print('request.path_info', request.path_info) # 只拿根路径部分 print('request.get_full_path()', request.get_full_path()) # 拿全路径路径加参数 return obj
3、删除cookie
obj = HttpResponse() # obj = render() # obj = redirect() obj.set_cookie('key', 'value') # 传入的前两个参数是键值对 obj.delete_cookie('key') # 删除cookie键值对 return obj
后端views.py代码:
def index2(request): obj = HttpResponse("it's index2.html") obj.set_cookie('key', 'value') # 传入的前两个参数是键值对 print(request.COOKIES.get('key')) # cookie键值对取值 obj.delete_cookie('key') # 删除 print(request.COOKIES.get('key')) # cookie键值对取值 return obj
4、登录认证装饰器
需求:写一个登陆认证装饰器:限制登陆用户名密码之后才能够访问其他网页
后端view.py代码:
from functools import wraps # 登陆认证装饰器 def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): print('request.path_info', request.path_info) print('request.get_full_path()', request.get_full_path()) target_url = request.path_info # 执行被装饰函数之前可以做的事情 if request.COOKIES.get('username'): res = func(request, *args, **kwargs) else: return redirect('/login/?next=%s' % target_url) return res return inner
5、例:使用登陆认证装饰器
演示:使用登陆认证装饰器并装饰其他页面,限制登陆用户名密码之后才能够访问其他网页,cookie超时时间为60秒
后端view.py代码:
from django.shortcuts import render, HttpResponse, redirect from functools import wraps # 登陆认证装饰器 def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): print('request.path_info', request.path_info) print('request.get_full_path()', request.get_full_path()) target_url = request.path_info # 执行被装饰函数之前可以做的事情 if request.COOKIES.get('username'): res = func(request, *args, **kwargs) else: return redirect('/login/?next=%s' % target_url) return res return inner # 登陆页面:登陆成功前端自动生成cookie键值对 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'tank' and password == '123': # target_url = request.GET.get('next', '/home/') target_url = request.GET.get('next') # 判断用户登录之前是否有想要访问的url if target_url: # 保存用户登录状态 obj = redirect(target_url) else: obj = redirect('/home/') # 设置cookie obj.set_cookie('username', 'jackie', max_age=60) # max_age设置超时时间为60s return obj return render(request, 'login.html') # 登陆之后可以访问home页面 @login_auth def home(request): if request.COOKIES.get('username'): print(request.COOKIES) return HttpResponse('我是home页面') else: return redirect('/login/') # return HttpResponse('我是home页面') # 登陆之后可以访问index页面 @login_auth def index(request): return HttpResponse('我是index页面') # 登陆之后可以访问demo页面 @login_auth def demo(request): return HttpResponse('我是demo页面') # 注销页面:登陆之后可以访问logout页面 @login_auth def logout(request): obj = HttpResponse('已注销') obj.delete_cookie('username') return obj
后端urls.py代码:
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index,), url(r'^demo/', views.demo,), url(r'^home/', views.home,), url(r'^logout/', views.logout,), ]
前端login.html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="" method="post" novalidate> <p>username: <input type="text" name="username" class=""> </p> <p>password: <input type="text" name="password"> </p> <p> <input type="submit"> </p> </form> </div> </div> </div> </body> </html>
三、session操作
1、设置session
request.session['key'] = value # session键值对 return HttpResponse() """ 设置session内部发生的事情:
1.django内部会自动生成一串随机字符串 2.去django_session表中存储数据,键就是随机字符串,值就是保存的数据 3.将生成的随机字符串返回给客户端浏览器,浏览器保存键值对 sessionid 随机字符串 """
后端views.py代码:
def set_session(request): request.session['name'] = 'jackie' request.session.set_expiry(60) # 设置session超时时间为60s """ # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 """ return HttpResponse('我是set_session页面')
2、获取session
print(request.session.get(key)) # session键值对取值 return HttpResponse() """ 获取session内部发生的事情: 1.django内部会自动生成一个随机字符串 2.去django_session表中存储数据,键就是随机字符串,值就是保存的数据 3.将生成的随机字符串返回给客户端浏览器,浏览器保存键值对 sessionid 随机字符串 """
后端views.py代码:
def get_session(request): # print(request.session) # <django.contrib.sessions.backends.db.SessionStore object at 0x0000000004122688> print(request.session.get('name')) return HttpResponse('我是get_session页面')
3、删除session
# 删除session有两种方式: # request.session.delete() # 第一种方法:删除当前会话的所有Session数据 request.session.flush() # 第二种方法:删除当前的会话数据并删除会话的Cookie *****推荐使用***** """ 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如:django.contrib.auth.logout() 函数中就会调用它。 """ return HttpResponse()
后端views.py代码:
def del_session(request): print(request.session.get('name')) request.session.flush() print(request.session.get('name')) return HttpResponse('我是del_session页面,session已删除')