• tornado 09 cookie和session


    tornado 09 cookie和session

    一、cookie

    #有什么办法能够让浏览器记住登录信息,下次再打开的时候可以自动登录?网站是如何记录登录信息的?
    class SetCookieHandler(tornado.web.RequestHandler):
        def get(self):
            self.set_cookie('cookie_test','xuwei') #到期时间为会话结束
            self.set_cookie('cookie_test2','zhouxuming',expires=time.time()+60) #到期时间设置60s
            self.set_cookie('cookie_test3','liuzezhong',expires_days=1)  #到期时间设置1天
            self.set_cookie('cookie_test4','liuzezhong1',path='/') #获取路径
            self.set_cookie('cookie_test5','liuzezhong2',httponly = True) #JS就不会被cookie获取到
            self.set_cookie('cookie_test6','liuzezhong3',max_age = 120 , expires=time.time()+60)  #max_age优先级比expires高,前面为120s,所以根据前面的来
            self.set_secure_cookie('cookie_test7','xuchengcheng')  #设置一个加密的cookie,但是必须在下面的application里面添加cookie_secret = 'lidang',才可以
            self.write('set cookie')
    
    class GetCookieHandler(tornado.web.RequestHandler):
        def get(self):
            get_cookie = self.get_cookie('cookie_test')
            get_cookie2 = self.get_cookie('cookie_test2')
            get_cookie3 = self.get_secure_cookie('cookie_test7')
            print(get_cookie,get_cookie2,get_cookie3)
            self.write('get cookie')

    二、验证登录

      如何实现自动验证

    #1、导入装饰器
    from tornado.web import authenticated
    
    #2、设置BaseHandler类,重写函数get_current_user
    class BaseHandler(tornado.web.RequestHandler):
        def get_current_user(self): #前面有绿色小圆圈带个o,再加一个箭头表示重写
            current_user = self.get_secure_cookie('ID')
            if current_user:
                return current_user
            return None
    
    #3、在LoginHandler类中的post函数里面加上
     self.set_secure_cookie('ID',user)
    
    #4、在BuyHandler类里面添加装饰器
    class BuyHandler(BaseHandler):
        @authenticated
        def get(self):
            self.write('许铖铖买了好多书')
    
    #5、在application里面设置跳转路由
            login_url = '/login',

      在登录完成后,从一个路由跳转到登录页面,在完成登录之后,该如何跳到之前的页面

    #1、获取之前的路由
    #在使用authenticated之后,如果验证不成功,会自动跳转登陆路由,并且在URL后面添加上next参数,next参数的参数值就是之前的路由
        def get(self, *args, **kwargs):
            nextname = self.get_argument('next','') #将原来的路由赋值给nextname
            self.render('lesson2.html',nextname = nextname) #跳转到html后
    
    #2、修改模板文件
    #在html模板中添加next参数,并且参数值为之前的路由
        <form method="post" action="/login?next={{ nextname }}">
    
    #3、修改post方法
    #获取之前的页面的路由,当登录验证通过之后,设置加密的cookie,并跳转到之前的路由
        def post(self, *args, **kwargs):
            nextname = self.get_argument('next','') #获取之前页面的路由
            user = self.get_argument('name')
            password = self.get_argument('password','')
            username =User.by_name(user)
            if username and password == username[0].password:
                self.set_secure_cookie('ID',user)
                self.redirect(nextname) #跳转带之前的路由
            else:
                self.render('lesson2.html',nextname=nextname)

    三、session

    #cookie的信息可以用来保存用户的登录信息,但是cookie是很容易被拦截的,所以其中必定不能有用户的任何私密信息,有没有一种办法可以让服务器保存用户的登录信息,但是cookie中又不会有用户的任何信息?
    #1、安装模板
    #在MySQL里面输入pip install pycket ;pip install redis
    #或者
    #file--->Default Settings ---> Project Interpreter ---->绿色加号 添加模块
    
    #2、 导入模块
    from pycket.session import SessionMixin
    
    #3、继承SessionMixin
    class BaseHandler(tornado.web.RequestHandler,SessionMixin):
    
    class LoginHandler(tornado.web.RequestHandler,SessionMixin):
    
    #4、在application里面添加配置
    pycket = {
                'engine':'redis',
                'storage':{
                    'host':'localhost',
                    'port':6379,
                    'db_sessions':5,
                    'db_notifications':11,
                    'max_connections':2 ** 33,
                },
                'cookie':{
                    'expires_days':38,
                    'max_age':100
                }
            }
    
    #5、在BaseHandler里面修改设置cookie为设置session
        current_user = self.session.get('user')
    
    #6、在LoginHandler里面的post里面修改获取cookie为获取session
        self.session.set('user',username[0].username)

    四、XSRF

    #使用session可以保证用户信息不被cookie泄露,那如果攻击者不想获取用户信息,只是在提交form表单是攻击,该如何防范?
    
    #只需要在html模板中添加  {% module xsrf_form_html() %}  即可
    #当登录信息发送到服务器中去的时候,form表单和cookie里面都会有一个随机码,如果发送到服务器的时候这两个码不相同,那就表示被拦截了,服务器会拒绝客户端发送的请求
  • 相关阅读:
    JQuery的ajax方法
    Android&Java面试题大全—金九银十面试必备【上】
    分享一下身边朋友自学android开发及找工作的那些事!【不足勿喷】
    分享一下身边朋友自学android开发及找工作的那些事!【不足勿喷】
    Android常用面试题和常见问题!
    关于 Android 进程保活,你所需要知道的一切
    关于 Android 进程保活,你所需要知道的一切
    Fragment Transactions和Activity状态丢失
    Fragment Transactions和Activity状态丢失
    mysql如何导入csv格式数据
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9050177.html
Copyright © 2020-2023  润新知