关于cookie和session的认识
一、关于cookie的产生的原因
- 1、由于
HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户 - 2、但是服务端如何识别特定的客户?这个时候
Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用Cookie来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在Cookie里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了Cookie怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如sid=xxxxx这样的参数(或者在请求头里面加上一个token是比较常见的,就是用来标识用户),服务端据此来识别用户。 - 3、
Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。
二、在django中获取cookie
1、直接使用
request.COOKIES来获取cookies,获取到的cookies是一个字典,可以直接取值出来from django.shortcuts import render, HttpResponse from django.views import View class LoginView(View): def get(self, request): print(request.COOKIES) return render(request, 'test1.html') def post(self, request): print('request====', request.POST) print(request.COOKIES) return HttpResponse('成功')2、服务器端设置
cookie(使用ret.set_cookie(key, val))class LoginView(View): def get(self, request): print(request.COOKIES) return render(request, 'test1.html') def post(self, request): print('request====', request.POST) print(request.COOKIES) username = request.POST.get('username', None) passwd = request.POST.get('passwd', None) if username == '123' and passwd == 'admin123': # 登录成功设置cookie ret = redirect('/test1/index') ret.set_cookie('username', username) return ret return HttpResponse('登录失败') class IndexView(View): def get(self, request): print('获取的cookie', request.COOKIES) return render(request, 'index.html')3、
cookie设置时间(不指定是2周)... # 这里的时间是按天来计算的 ret.set_cookie('username', username, max_age=1) ...
二、关于cookie的缺陷
- 1、前面说到的
http是无状态的,我们一般会用cookie来标识用户 - 2、既然是这样,
cookie中肯定有用户信息,被人劫持了就可以获取用户一些基本信息 - 3、由于
cookie直接在浏览器上可以查看到,很容易被人劫持

三、关于session和cookie配合使用
由于前面说到的cookie会被人劫持获取到用户信息,因此才产生了session(注意不是前端本地存储的window.sessionStorage)
session存在服务器端,cookie存在客户端,现在服务器端给浏览器的就是一个key(通俗点就是一个钥匙),用户请求的时候都要携带这个key(钥匙),服务器端拿到客户端的这个key然后进行校验(俗称开锁),如果匹配成功就表示当前用户是有效的,否则是无效的.
四、session的使用
1、
django中关于session是存放在中间件中MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # session的中间件 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]2、获取
session的方法(request.session)# 获取到的session是一个对象 获取session <django.contrib.sessions.backends.db.SessionStore object at 0x109e7ecf8>3、由于
session是存在数据库中要先生成表python manage.py makemigrations python manage.py migrate3、设置
sessionclass LoginView(View): def get(self, request): print(request.COOKIES) return render(request, 'test1.html') def post(self, request): username = request.POST.get('username', None) passwd = request.POST.get('passwd', None) if username == '123' and passwd == 'admin123': # 登录成功设置session request.session['username'] = username request.session['is_login'] = True return redirect('/test1/index') return HttpResponse('登录失败')4、获取
sessionclass IndexView(View): def get(self, request): print('获取session', request.session.get('is_login')) print('获取session', request.session.get('username')) return render(request, 'index.html')5、查看数据库中存储的
session- 1.我们自己都不知道存的是什么东西
- 2.没有设置过期时间默认是2week(14day)

6、
session设置时间request.session.set_expiry(valule)- 1.如果
vaule是一个整数表示,session在这毫秒后就会失效 - 2.如果
vaule是一个datatime或者timedelta表示,session在这个时间点后就会失效 - 3.如果
vaule是一个0表示,session在浏览器关闭好就会失效 - 4.如果
vaule是一个None表示,session会依赖全局的session策略
- 1.如果
五、前面说的客户端存储是一个key,拿去与服务器端对比
