COOKIE
COOKIE介绍
本质:cookie就是一个键值对,比如自己是一个浏览器,我们要去访问服务器,第一次我们就
自己去,然后服务器给我们分配了一个键值对,下一次我们再去的时候就带着他可以直接进去,
(实际上也是验证了),但是前提是我们在特定的时间内去,如果过期了的话那我们就得重新再
来一遍,就比如我们的淘宝之类的,但是我们很长时间不登录,就要重新登录
理解COOKIE机制
cookie机制的基本原理就如同会员卡那样简单,出示会员卡我就按照这个会员卡给你积分,知道你的消费情况不过更有几个问题需要解决:“会员卡”怎么分发;“会员卡”的内容;及客户怎么使用“会员卡”。
正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特别的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript也能生成cookie。
而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。
cookie的内容主要包括:名字,值,过期时间,路径和域。
其中域能指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也能指定一个域下的具体某台机器比如www.google.com或froogle.google.com,能用飘柔来做比。
路径就是跟在域名后面的URL路径,比如/或/foo等等,能用某飘柔专柜做比。
路径和域合在一起就构成了cookie的作用范围。
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
存储在硬盘上的cookie能在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或从文件菜单)打开的窗口能和原窗口共享,而使用其他方式新开的IE进程则不能共享已打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都能共享同样的cookie。一般来说是用javascript的window.open打开的窗口会和原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程式研发者造成非常大的困扰。
cookie初始
获取Cookie(这些操作都是在Django中进行的)
request.COOKIES['key']
request.get_signed_cookie(key,default=RAISE_ERROR,salt='',max_age=None)
default 默认值
salt 加密盐(也就是自己给起个名名字,属于自己的,比较安全)
max_age 后天控制过期时间,(比如我们一年不登录淘宝的时候,再次打开就需要重新登录,但是经常登录却不需要重复使用用户名和密码,)
cookie设置
rep = HttpResponse(...)
rep = render(request, ...)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
key 键
value 值
max_age=None 超时时间
expires=None 超时时间
path='/',Cookie 生效的路径,/表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None Cookie生效的域名
secure=False, http传输
httponly=False 只能是http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
删除Cookie
Cookie版的登录校验
urls部分
rom django.conf.urls import url
# from django.contrib import admin
from app02 import views as v2
urlpatterns = [
url(r'login/$', v2.login),
url(r'index1/$', v2.index1),
url(r'index2/$', v2.index2),
]
views中
from django.shortcuts import render, redirect
# Create your views here.
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
# 校验用户名密码是否正确
if user == "alex" and pwd == "dashabi":
# 登陆成功
rep = redirect("/index1/")
# rep.set_cookie("user", user)
# import datetime
# now = datetime.datetime.now()
# d = datetime.timedelta(seconds=10)
# rep.set_signed_cookie("user3", user, salt="S8", expires=now+d)
rep.set_signed_cookie("user3", user, salt="S8", max_age=100, path="/index1/")
return rep
return render(request, "login.html")
def index1(request):
# user = request.COOKIES.get("user")
user = request.get_signed_cookie("user3", None, salt="S8")
if not user:
# 表示没有登录
return redirect("/login/")
return render(request, "index1.html", {"username": user})
def index2(request):
# user = request.COOKIES.get("user")
user = request.get_signed_cookie("user3", None, salt="S8")
if not user:
# 表示没有登录
return redirect("/login/")
return render(request, "index2.html", {"username": user})
前端部分
login
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登录</title>
</head>
<body>
<form action="/login/" method="post">
{% csrf_token %}
<input type="text" name="user">
<input type="password" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>
index1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>首页</title>
</head>
<body>
<h1>这是index1页面</h1>
<h1>Hello, {{ username }}</h1>
</body>
</html>
index2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>首页</title>
</head>
<body>
<h1>这是index2页面</h1>
<h1>Hello, {{ username }}</h1>
</body>
</html>
装饰器版的COOKIE登录校验
(url、前端和上面COOKIE版的登录校验一样)
from django.shortcuts import render, redirect
# Create your views here.
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "lanbo" and pwd == "123456":
rep = redirect("/index/")
rep.set_signed_cookie("user2", user, salt="a1",max_age=100,path="/index/")
return rep
return render(request, "login.html")
def auth(func):
def inner(request,*args,**kwargs):
user_info = request.get_signed_cookie("user2", None, salt="a1")
if not user_info:
return redirect("/login/")
return func(request,*args,**kwargs)
return inner
@auth
def index(request):
user_info = request.get_signed_cookie("user2", None, salt="a1")
return render(request,"index.html",{"username":user_info} )
@auth
def index1(request):
user_info = request.get_signed_cookie("user2", None, salt="a1")
return render(request,"index1.html",{"username":user_info})