01 cookie

在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢?

有没有什么办法可以让浏览器记住登录信息,下次再次打开的时候,可以自动登录呢?

设置 cookie

self.set_cookie('cookie_test','this_is_test')#默认过期时间是浏览器关闭会话时 self.set_cookie('cookie_test1','this_is_test',expires=time.time()+60)#设置过期时间为60秒 self.set_cookie('cookie_test2','this_is_test',expires_days=1)#设置过期时间为一天 self.set_cookie('cookie_test3','this_is_test',path='/') #默认目录 self.set_cookie('cookie_test4','this_is_test',httponly=True) #设置路径,设置 js 不可以获取cookie self.set_cookie('cookie_test5','this_is_test',max_age=120,expires=time.time()+60)#max_age 优先级高,过期时间变为120秒。

self.set_secure_cookie('cookie_test6','this_is_test')#设置加密cookie,需要设置 application 的 cookie_secret 参数

获取 cookie

self.get_cookie('cookie_test') # 获取一般的 cookie

self.get_secure_cookie('cookie_test6') #获取加密 cookie

02 登录验证

继续回到上个问题,我们希望用户只需要在第一次登录的时候输入用户名和密码,之后可以自动登录,不需要再次输入用户名和密码,也就是说在用户第二次访问的时候,服务器能够自动的验证用户登录信息,那么如何实现自动验证的功能呢?

第一步:导入装饰器

fromtornado.web import authenticated

第二步:声明 BaseHandler

class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): current_user = self.get_secure_cookie('ID') if current_user: return current_user return None

第三步:配置登录路由

login_url='/login',

第四步:装饰需要验证的请求

class BuyHandler(BaseHandler): @authenticated def get(self): self.write('BuyHandler')

在完成登录之后,再来看看,我们从一个路由跳转到登录页面之后,再完成登录之后,该如何跳转到之前的页面呢?

第一步:获取之前路由

class LoginHandler(BaseHandler): def get(self): nextname = self.get_argument('next','') self.render('01in_out.html',nextname=nextname)

在使用 authenticated之后,如果验证不成功,会自动跳转到登录路由,并且在 URL 后面加上 next 参数,next 参数的参数值就是之前的路由

第二步:修改模板文件

‘<form method="post" action="/login?next={{ nextname }}">’ 在模板中添加 next 参数,并且参数值为之前的路由

第四步:修改post方法

def post(self, args, kwargs): nextname = self.get_argument('next', '') user = self.get_argument('name', '') username = User.by_name(user) passwd = self.get_argument('password', '') if username and passwd == username.password: self.set_secure_cookie('ID', username.username, max_age=100) self.redirect(nextname) else: self.render('01in_out.html', nextname=nextname)

获取之前的页面的路由,当登录验证通过之后,设置加密的 cookie ,并跳转到之前的路由

03 session

通过刚才的学习,可以用了解到 cookie中的信息可以用来保存用户的登录信息,但是coolkie是很容易被拦截的,所有其中必定不能有用户的任何私密信息,那么又有什么办法可以让服务器保存用户的登录信息,但是cookie中又不会有用户的任何信息呢?

第一步:安装模块

pip install pycket

pip install redis

第二步:导入模块

from pycket.session import SessionMixin

第三步:继承SessionMixin

class BaseHandler(tornado.web.RequestHandler, SessionMixin):

第四步:在application 中添加配置

pycket={ 'engine': 'redis', 'storage': { 'host': 'localhost', 'port': 6379, 'db_sessions': 5, 'db_notifications': 11, 'max_connections': 2 31, }, 'cookies': { 'expires_days': 30, 'max_age': 100 }, },

配置 redis 的相关信息

配置 cookie 的过期时间

第五步:改设置cookie为设置session

self.session.set('user',username[0].username)

第六步:改获取cookie为获取session

current_user = self.session.get('user')

04 XSRF

使用session可以保证用户信息不被cookie泄漏,那如果如果攻击者不想获取用户信息,只是在提交form 表单时攻击,该怎么防范呢?

XSRF 跨站伪造请求

模板添加

{% module xsrf_form_html()%}

Tornado 有内建的 XSRF 的防范机制,要使用此机制,只需要在模板中添加如上代码

tornado框架基础09-cookie和session的更多相关文章

  1. tornado 09 cookie和session

    tornado 09 cookie和session 一.cookie #有什么办法能够让浏览器记住登录信息,下次再打开的时候可以自动登录?网站是如何记录登录信息的? class SetCookieHa ...

  2. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  3. django基础 -- 8.cookie 和 session

    一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...

  4. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  5. Go语言基础之Cookie和Session

    Cookie和Session Cookie和Session是Web开发绕不开的一个环节,本文介绍了Cookie和Session的原理及在Go语言中如何操作Cookie. Cookie Cookie的由 ...

  6. django框架中的cookie与session

    cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小 ...

  7. pyhton框架Django之cookie和session

    一,cookie和session的理解 cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.它保存在浏览器下的某个文 ...

  8. Django框架介绍之cookie与session

    cookie http请求时无状态的,一个客户端第一次,第二次,第n次访问同一个服务器都是一样的,服务器都会按照一个新的连接处理.但是,有时候客户端需要服务器记住客户端的登录状态,譬如离开一会,回来之 ...

  9. java基础之----cookie,session,jwt

    概要 web中为什么要引入cookie.session机制,为了验证用户的身份,验证用户的身份是为了系统的安全,那如果是系统和系统之间的API调用怎么办呢?因为系统之间调用往往是没有用户系统的(用户系 ...

  10. Django框架中的Cookie和Session

    学习内容: (1)cookie (2)session Web是基于请求/响应模式,HTTP协议是无状态的,但是基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常 ...

随机推荐

  1. YCOJ黑熊过河

    Description 有一只黑熊想过河,但河很宽,黑熊不会游泳,只能借助河面上的石墩跳过去,他可以一次跳一墩,也可以一次跳两墩,但是每起跳一次都会耗费一定的能量,黑熊最终可能因能量不够而掉入水中,所 ...

  2. 鸟哥私房菜基础篇:学习 Shell Scripts习题

    猫宁!!! 参考链接:http://cn.linux.vbird.org/linux_basic/0340bashshell-scripts.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-请 ...

  3. ipset 学习总结

    用途:当机器受到网络攻击时,使用 iptables 封 IP,有时候可能会封禁成千上万个 IP,如果添加成千上万条规则, 在一台注重性能的服务器或者本身性能就很差的设备上就不在适用了.ipset 就是 ...

  4. 双拓扑排序 HDOJ 5098 Smart Software Installer

    题目传送门 /* 双拓扑排序:抄的,以后来补 详细解释:http://blog.csdn.net/u012774187/article/details/40736995 */ #include < ...

  5. RHEL 6.5----LVS(DR)

    主机名 IP  所需软件  master eth0==>192.168.30.140(Nat) eth0:1==>192.168.17.130(Nat) ipvsadm node-1 et ...

  6. 关于margin、padding 对内联元素的影响

    内联元素和块级元素的区别是新手必须要掌握的知识点.大家可能平时注意块级元素比较多.所以这里重点让我们来讲讲常见的width height margin  padding 对inline元素的影响. 测 ...

  7. Java_静态变量

    class c1c { private static int num = 0; private static double pi = 3.14; private double radius; priv ...

  8. Java 11 正式发布,支持期限至2026年9月

    美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,非常值得大家的关注,可以通过下面的地址进 ...

  9. 盘点那些年,被Oracle收购的公司

    微博上看到一图,很清晰.盘点那些年,被Oracle收购的公司,Oracle日益强大,都收购了哪些公司呢?别再以为只有Sun啦...看看你都知道哪些? ps:Strategic Acquisitions ...

  10. Spring中@Value的使用