tornado九:Cookie

一、Cookie

tornado中分为普通Cookie,安全Cookie。django中只有普通Cookie。

Cookie保存在浏览中,Cookie会保持一会信息,每次浏览器发送服务器请求,都会携带Cookie。

用户名和密码不能存在Cookie中;用户登录成功以后,服务器会传一个toekn给用户,用户将token缓存在用户浏览器中,后续用户继续访问,使用token替代用户验证。

这个随机token,可以设置在用户表中,后续验证,使用用户表中这个token值验证。

此token用于验证用户是否登录,而不是替代用户登录。

二、设置Cookie: self.set_cookie()

1.创建路由

            # 普通Cookie
            (r'/cookie', index.CookieHandler),

 

2.创建Handler

设置cookie使用self.set_cookie()方法。

# self.set_cookie原型
# self.set_cookie(name, value, domain, expires=None, path="/", expires_days=None, **kwargs)

name: cookie名

value:cookie的值

domain:提交cookie时匹配的域名;用户的ip,通常为默认值None

path:提交cookie时匹配的路径;通常为默认值"/"

expires:cookie的有效期,可以是时间戳整数,时间元组,datetime类型;为UTC时间。

expires_days:cookie的有效期天数,它的优先级低于expires

class CookieHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.set_cookie("haha", "23234asdf")
        self.write("ok")

 

设置Cookie的原理:实际上通过设置headers的Set-Cookie实现的。因此使用self.set_header(“Set-Cookie”, "haha", "234sdf"),也一样设置Cookie。

 

三、获取Cookie:self.get_cookie(name, default=None)

name:要获取的cookie的名称

default:如果名为name的cookie不存在,返回default的值

            # 获取普通Cookie
            (r'/getcookie', index.GetCookieHandler),
class GetCookieHandler(RequestHandler):
    def get(self, *args, **kwargs):
        cookie = self.get_cookie("haha", "未登录")
     print "cookie = ", cookie
     self.write("ok")

 

四、清除Cookie

方法一,删除某一个cookie:self.clear_cookie(name, path="/", domain=None)

删除名为name,同时匹配path为"/",domain为None的cookie。

不同网站的cookie的名,可能相同;但path和domain可以不同;所以全匹配则删除。

执行清除cookie操作后,并不是立即删除浏览器上的cookie,而是在服务器上给cookie值设置空,并改变其有效期为失效。

真正在浏览器上删除cookie,由浏览器自己决定什么时侯删除。

class ClearHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.clear_cookie("haha")
        self.write("ok")

 

方法二,删除所有cookie:self.clear_all_cookies(path="/", domain=None)

清除所有同时匹配path和domain的所有cookie。

class ClearHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.clear_all_cookies()
        self.write("ok")

 

 

五、设置安全cookie:self.set_secure_cookie()

普通cookie:cookie是存放在客户端浏览器的数据,很容易被篡改!

安全cookie:tornado提供了一种对cookie进行简易加密方式的cookie来防止cookie被篡改。但是只是很简单的加密,同样很容易被篡改。

1.配置cookie:需要为应用配置一个用来给Cookie进行混淆加密的密钥。同样在settings中配置。

# 配置,同django.settings
settings = {
    "cookie_secret": "一串生成的密钥",
}

 

生成cookie的密钥:

import base64
import uuid
base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes)

 

base64:一种基本64个可打印字符来表示二进制数据的表示方法。

由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。

三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。

uuid:通用唯 一识别码,由一组32个16进制数字所构成。

两个16进制数是一个字节,总共16字节。

uuid理论上的总数为16的32次方,即2的128次方,约等于3.4*10^38。如果每纳秒产生1兆个uuid,要花100亿年才会将所有uuid用完。

uuid模块的uuid4()函数可以随机产生一个uuid码,bytes属性将此uuid码作为16字节字符串。

2.路由

            # 设置安全cookie
            (r'/scookie', index.SCookieHandler),

 

3.handler

设置安全cookie:self.set_secure_cookie()

方法原型:self.set_secure_cookie(name, value, domain, expires_days=None, **kwargs)

作用:设置一个带有签名和时间戳的cookie,防止cookie被篡改。

class SCookieHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.set_secure_cookie("hehe", "23es")
        self.write("ok")

 

查看浏览端的cookie值:'2|1:0|10:1502367895|4:hehe|8:bjdsfk==|kladsfj234wasdf...asdfja;lsdf'

以‘|’分隔,第一段的值2,表示安全cookie的版本,默认使用版本2

依次,第二段1:0,冒号前的1表示后面的值为1位,值0,为默认值

依次,第三段10:1502367895,冒号前的10表示后面的值为10位,值1502367895,表示时间戳

第四段,4:hehe,表示cookie的名称为hehe,长度为4

第五段,base64编码的cookie值;

第六段,最后一段,签名值,不带长度说明。

 

六、获取安全cookie:self.get_secure_cookie()

原型:self.get_secure_cookie(name, value=None, max_age_days=31, min_version=None)

如果cookie存在且验证通过,返回cookie值;否则返回value的值。

max_age_days不同于expires_days:

expires_days用于设置浏览器中的有效时间;

max_age_days用于过滤安全cookie的时间戳,即只取max_age_days天内的cookie。

            # 设置安全cookie
            (r'/scookie', index.SCookieHandler),

 

class GetSCookieHandler(RequestHandler):
    def get(self, *args, **kwargs):
        cookie = self.get_secure_cookie("abc", "未登录")

 

七 cookie计数

记录浏览器访问某网站的次数

            # cookie计数
            (r'/cookienum', index.CookieNumHandler),

 

class CookieNumHandler(RequestHandler):
    def get(self, *args, **kwargs):
        count = self.get_cookie("count", None)
        if not count:
            count = 1
        else:
            count = int(count)
            count += 1
        self.set_cookie("count", str(count))
        self.write(count)

 

 

对于修改类的操作,通常将cookie的修改放在post请求。

 

posted on 2018-07-30 23:12  myworldworld  阅读(190)  评论(0)    收藏  举报

导航