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) 收藏 举报
浙公网安备 33010602011771号