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})

  

 

posted @ 2018-01-25 17:34  兰博~~  阅读(176)  评论(0编辑  收藏  举报