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. LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925

    题目传送门 题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价. 这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了 ...

  2. POJ1961(kmp中Next数组的性质)

    对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元. ; int n, kase, Next[maxn]; char ch[maxn]; inli ...

  3. cmd命令下执行jar包程序

     在cmd中使用指令来执行jar包 概述: 今天有一个需求,要在cmd中执行.jar文件 实践: 1.新建你的Hello world 2.导出到jar包 3.打开你的成功导出的jar包 4.打开文件夹 ...

  4. Ionic之数据绑定ng-model

    ionic 完美的融合下一代移动框架,ionic 基于Angular语法,支持 Angularjs 的特性.但是我在开发的时候,遇到了坑.因为之后用的就是angularjs,so 理所当然的以为代码应 ...

  5. P2956 [USACO09OCT]机器人犁田The Robot Plow

    题目描述 Farmer John has purchased a new robotic plow in order to relieve him from the drudgery of plowi ...

  6. vue_resource 使用说明

    前几天用vue-resource调用接口,用post方式给后端,发现后端php接受不到数据,这好奇怪,最后发现提交给后端的时候 需要加一个参数 就是:emulateJSON : true 这句话的意思 ...

  7. SQL系列函数——字符串函数

    1.charindex函数用来寻找一个指定的字符(串)在另一个字符串中的起始位置,返回一个整数,没找到就返回0. select CHARINDEX('SQL','Microsoft SQL SERVE ...

  8. 一个Java编写的小玩意儿---多人在线聊天工具

    这个在线聊天工具小项目使用JAVA编写,用JAVA来做图形界面本来就是出了名的低效和丑陋.不过这不是重点.写这个小项目的目的在于串一串J2SE的知识,把当时写这个项目的时候的思路梳理一下.时间有点久了 ...

  9. UVM基础之------uvm_transaction

    uvm_transaction继承自uvm_object,添加了timing和recording接口,该类是uvm_sequence_item的基类.下边将做剖析 1. 这个类提供了时间戳属性(tim ...

  10. 回顾PMP考试

    2014年9月20日,于我来说绝对可以说是一个重要的日子.经过考场里4个多小时(4个小时正式的时间+前面的签到以及后面的survey等)的鏖战,出去之后才发现北京外国语大学的楼宇是如此的漂亮,阳光也是 ...