目前大多数服务器判断用户是否登录一般通过session机制,Tornado 通过 set_secure_cookie 和 get_secure_cookie 方法直接支持了这种功能。原理类似于session,只不过session是服务器自动生成一个sessionID存储在cookie里,而tornado需要我们手工设cookie。然后通过self.current_user的重载函数就可以实现用户的验证。

首先来看下set_secure_cookie和get_secure_cookie的使用方法:

Tornado的set_secure_cookie()和get_secure_cookie()函数发送和取得浏览器的cookies,以防范浏览器中的恶意修改。为了使用这些函数,你必须在应用的构造函数中指定cookie_secret参数。让我们来看一个简单的例子。这个例子将统计浏览器中页面被加载的次数。如果没有设置cookie或者cookie被篡改了,应用将设置一个值为1的新cookie,否则应用将从cookie中读到的值加1

class MainHandler(tornado.web.RequestHandler):

def get(self, *args, **kwargs):

cookie=self.get_secure_cookie("count")

print cookie

count=int(cookie) + 1 if cookie else 1

countstring="1 time" if count == 1 else "%d times" % count

self.set_secure_cookie("count",str(count))

content='you have viewed this page %s times' % countstring

print content

self.write(content)

def server_function():

cookie='bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E='

tornado.options.parse_command_line()

app = tornado.web.Application(handlers=[(r"/", MainHandler),(r"/show",showHandler),(r"/index1",indexHandler_temp)],template_path=os.path.join(os.path.dirname(__file__),"template"),

static_path=os.path.join(os.path.dirname(__file__),"static"),ui_modules={'Book':HelloModule},cookie_secret=cookie)

http_server = tornado.httpserver.HTTPServer(app)

http_server.listen(options.port,address='127.0.0.1')

tornado.ioloop.IOLoop.instance().start()

首先来运行看下结果:

在浏览器中输入url,可以看到显示的是浏览了一次网站

来看下服务器后端的打印。首先通过self.get_secure_cookie("count")得到的的cookie值是None,也就是空的。此时访问次数的赋值是count=int(cookie) + 1 if cookie else 1,在cookie为空的时候,count=1, 否则是int(cookie)+1. 最终通过self.set_secure_cookie("count",str(count))将更新好的count值以及cookie值再带给服务器。cookie值是通过在Application中设置的cookie='bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E='

/usr/bin/python2.7 /home/zhf/py_prj/tornada_try.py

None

you have viewed this page 1 time times

[I 180103 10:50:10 web:2063] 200 GET / (127.0.0.1) 0.92ms

不停的刷新浏览器,可以看到对应的count值也在不断的积累,通过这个我们就能监控到访问的网站的次数。

/usr/bin/python2.7 /home/zhf/py_prj/tornada_try.py

None

you have viewed this page 1 time times

[I 180103 10:50:10 web:2063] 200 GET / (127.0.0.1) 0.92ms

[I 180103 10:56:59 web:2063] 200 GET / (127.0.0.1) 0.62ms

1

you have viewed this page 2 times times

[I 180103 10:57:09 web:2063] 200 GET / (127.0.0.1) 0.57ms

2

you have viewed this page 3 times times

3

you have viewed this page 4 times times

[I 180103 10:57:11 web:2063] 200 GET / (127.0.0.1) 2.03ms

4

[I 180103 10:57:12 web:2063] 200 GET / (127.0.0.1) 2.08ms

you have viewed this page 5 times times

[I 180103 10:57:13 web:2063] 200 GET / (127.0.0.1) 2.06ms

5

you have viewed this page 6 times times

6

you have viewed this page 7 times times

[I 180103 10:57:14 web:2063] 200 GET / (127.0.0.1) 2.24ms

7

you have viewed this page 8 times times

[I 180103 10:57:14 web:2063] 200 GET / (127.0.0.1) 2.31ms

在浏览器也可以查看到服务器发下来的cookie值,其中携带了count值

但是如果我们在浏览器上删除了这个cookie值,我们来看下运行的结果如何:

我们看到访问的次数又变成1了。

再看下服务器端的打印:之前访问的次数是11次,由于在浏览器上删除了cookie值,因此获得的count值为None,因此又重新计数。

10

you have viewed this page 11 times times

[I 180103 11:03:57 web:2063] 200 GET / (127.0.0.1) 0.59ms

[W 180103 11:03:57 web:2063] 404 GET /favicon.ico (127.0.0.1) 1.24ms

None

you have viewed this page 1 time times

[I 180103 11:04:19 web:2063] 200 GET / (127.0.0.1) 0.44ms

[W 180103 11:04:19 web:2063] 404 GET /favicon.ico (127.0.0.1) 0.50ms

同样的如果在MainHandler中添加清除cookie的命令self.clear_cookie("count")。那么浏览器的访问次数将永远是1

class MainHandler(tornado.web.RequestHandler):

def get(self, *args, **kwargs):

cookie=self.get_secure_cookie("count")

print cookie

count=int(cookie) + 1 if cookie else 1

countstring="1 time" if count == 1 else "%d times" % count

self.set_secure_cookie("count",str(count))

content='you have viewed this page %s times' % countstring

print content

self.write(content)

self.clear_cookie("count")

运行结果:

None

you have viewed this page 1 time times

[I 180103 11:08:50 web:2063] 200 GET / (127.0.0.1) 2.12ms

None

you have viewed this page 1 time times

[I 180103 11:08:51 web:2063] 304 GET / (127.0.0.1) 1.62ms

[I 180103 11:08:51 web:2063] 304 GET / (127.0.0.1) 1.94ms

None

you have viewed this page 1 time times

Tornado的cookie功能依附于Python内建的Cookie模块。因此,我们可以利用它所提供的一些安全功能。这些安全属性是HTTP cookie规范的一部分,并在它可能是如何暴露其值给它连接的服务器和它运行的脚本方面给予浏览器指导。比如,我们可以通过只允许SSL连接的方式减少cookie值在网络中被截获的可能性。我们也可以让浏览器对JavaScript隐藏cookie值。

为cookie设置secure属性来指示浏览器只通过SSL连接传递cookie。(这可能会产生一些困扰,但这不是Tornado的安全cookies,更精确的说那种方法应该被称为签名cookies。)从Python 2.6版本开始,Cookie对象还提供了一个httponly属性。包括这个属性指示浏览器对于JavaScript不可访问cookie,这可以防范来自读取cookie值的跨站脚本攻击。

为了开启这些功能,你可以向set_cookieset_secure_cookie方法传递关键字参数。比如,一个安全的HTTP-only cookie(不是Tornado的签名cookie)可以调用self.set_cookie('foo', 'bar', httponly=True, secure=True)发送。

有兴趣的可以搭建一个https网站去尝试下。

tornado安全应用之cookie的更多相关文章

  1. Tornado源码分析 --- Cookie和XSRF机制

    Cookie和Session的理解: 具体Cookie的介绍,可以参考:HTTP Cookie详解 可以先查看之前的一篇文章:Tornado的Cookie过期问题 XSRF跨域请求伪造(Cross-S ...

  2. tornado带签名的cookie原理

  3. 第一个web框架tornado

    简介 tornado,是我学到的第一个web框架是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google ...

  4. Python开发【第十五篇】:Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  5. Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  6. Tornado基本使用

    一.快速上手 #!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web class M ...

  7. [Python笔记]第十六篇:web框架之Tornado

    Tornado是一个基于python的web框架,xxxxx 安装 python -m pip install tornado 第一个Tornado程序 安装完毕我们就可以新建一个app.py文件,放 ...

  8. Python自动化运维之31、Tornado框架

    Tornado 官网:http://www.tornadoweb.org/en/stable/ Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本. ...

  9. python运维开发(二十三)---tornado框架

    内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...

随机推荐

  1. jmeter登录禅道案例

    下载jmeter,配置环境变量 变量名:JMETER_HOME 变量值:C:\Program Files\apache-jmeter-2.11 变量名:CLASSPATH 变量值:%JMETER_HO ...

  2. AC日记——【模板】最近公共祖先(LCA)洛谷 P3379

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  3. AC日记——教辅的组成 洛谷 P1231

    题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书 ...

  4. ASP.NET HttpContext类

      IHttpHandler 接口 定义 ASP.NET 以异步方式处理使用自定义 HTTP 处理程序的 HTTP Web 请求而实现的协定 封装http请求信息 HttpContext.Curren ...

  5. 某考试 T2 bomb

    轰炸(bomb)[题目描述]有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城市i到达城 ...

  6. Linux有问必答:如何检查Linux的内存使用状况

    -1. /proc/meminfo11% -2. atop20% -3. free29% -4. GNOME System Monitor35% -5. htop41% -6. KDE System ...

  7. scp 时出现permission denied

    如果scp到 /usr/local/目录下,则无权限,可更改到用户目录下

  8. 智能手机+DIY红外=万能遥控器

    目前好像只有:三星S4.,努比亚大牛,华为荣耀3等几款新机才有红外遥控功能,那我们使用的手机没有这个功能怎么办?不要急我有办法呵呵,本次DIY材料好找又简单,大家都可以亲自试一试! DIY材料:红外二 ...

  9. 这一篇里面有很多关于scala的list的操作的好的知识

    https://www.cnblogs.com/weilunhui/p/5658860.html 1.++[B]   在A元素后面追加B元素 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  10. Controller 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现 Controller 层以及一些辅助类的实现. 1.2 实验知识点 Spring MVC 框架 1.3 实验环境 JD ...