zoukankan      html  css  js  c++  java
  • cookies与session

    一、cookies

    • 本质:浏览器端保存的键值对

    • 方便客户按照自己的习惯操作页面或软件,例如:用户验证,登陆界面,右侧菜单隐藏,控制页面列表显示条数...

    • cookies是由服务端写在浏览器端,以后每次请求的时候,浏览器都携带者cookie来访问

      cookie的设置方式

    • tronado(后台设置)

    1. self.cookies
    2. self.get_cookie("k1")
    3. self.set_cookie("k2","v2")
    • 前端js设置

    1. document.cookie
    2. document.cookie.split(“;”)  获取所有的cookie列表
    3. document.cookie = “k3=66” 设置
    4. document.cookie = “k3=66;path='/”

      基本操作

    后台设置

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self, *args, **kwargs):
            print(self.cookies)
            print(self.get_cookie('k1'))
            self.set_cookie('k2', '999')
            self.render('index.html')
    
    settings = {
        'template_path':'views',
    }
    
    application = tornado.web.Application([
        (r"/index", MainHandler),
    ],**settings)
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    前端设置

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
     
    <script>
        function setCookieBySeconds(name, value, expires) {
            var current_date = new Date();
            current_date.setDate(current_date.getSeconds()+expires);
            document.cookie = name + '= ' + value +';expires=' + current_date.toUTCString();
        }
     
         function setCookieByDays(name, value, expires) {
            var current_date = new Date();
            current_date.setDate(current_date.getDate()+expires);
            document.cookie = name + '= ' + value +';expires=' + current_date.toUTCString();
        }
     
        //此外还可以导入jquery.cookie.js后通过
        // $.cookie('k1','v1',{expires:7});设置过期时间为7天
    </script>
    </body>
    </html>
    

      加密cookie(签名)

      cookie很容易被恶意的客户端伪造,加入你想在cookie中保存当前登陆用户的id之类的信息,你需要对cookie做签名以防止伪造,Tornado通过set_secure_cookie和get_secure_cookie方法直接支持了这种功能,要使用这些方法,你需要在创建应用一个密钥,名字为cookie_secret(在settings配置cookie_secret)

      签名Cookie的本质是:

    写cookie过程:

    • 将值进行base64加密
    • 对除值以外的内容进行签名,哈希算法(无法逆向解析)
    • 拼接 签名 + 加密值

    读cookie过程:

    • 读取 签名 + 加密值
    • 对签名进行验证
    • base64解密,获取值内容
    import tornado.ioloop
    import tornado.web
     
     
    class MainHandler(tornado.web.RequestHandler):
     
        def get(self):
            login_user = self.get_secure_cookie("login_user", None)
            if login_user:
                self.write(login_user)
            else:
                self.redirect('/login')
     
     
    class LoginHandler(tornado.web.RequestHandler):
        def get(self):
            self.current_user()
     
            self.render('login.html', **{'status': ''})
     
        def post(self, *args, **kwargs):
     
            username = self.get_argument('name')
            password = self.get_argument('pwd')
            if username == 'wupeiqi' and password == '123':
                self.set_secure_cookie('login_user', '武沛齐')
                self.redirect('/')
            else:
                self.render('login.html', **{'status': '用户名或密码错误'})
     
    settings = {
        'template_path': 'template',
        'static_path': 'static',
        'static_url_prefix': '/static/',
        'cookie_secret': 'aiuasdhflashjdfoiuashdfiuh'
    }
     
    application = tornado.web.Application([
        (r"/index", MainHandler),
        (r"/login", LoginHandler),
    ], **settings)
     
     
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    二、session

    • cookie保存单一键值对,session保存多个键值对

    • cookie是保存在客户端上,session是保存在服务端

    • session是基于cookie人为构建的

    • session在服务端存储类似于字典样式的结构,可以存在全局变量,数据库,文件,memcached radis,但是不能放在局部变量里

      1、面向对象基础

    • 面向对象中通过索引的方式访问对象,需要内部实现__getitem__、__delitem__、__setitem__方法

    class Foo(object):
    
        def __getitem__(self, key):
            print('__getitem__',key)
    
        def __setitem__(self, key, value):
            print('__setitem__',key,value)
    
        def __delitem__(self, key):
            print('__delitem__',key) 
    
    
    
    obj = Foo()
    result = obj['k1']
    #obj['k2'] = 'wupeiqi'
    #del obj['k1']
    

      2、Tornado扩展

    • Tornado框架中,默认执行Handler的get/post等方法之前默认会执行initialize方法,所以可以通过自定义的方式使得所有请求在处理前执行操作..
    class BaseHandler(tornado.web.RequestHandler):
       
        def initialize(self):
            self.xxoo = "wupeiqi"
       
       
    class MainHandler(BaseHandler):
       
        def get(self):
            print(self.xxoo)
            self.write('index')
     
    class IndexHandler(BaseHandler):
       
        def get(self):
            print(self.xxoo)
            self.write('index')
    

      3、自定义session

    import tornado.ioloop
    import tornado.web
    from hashlib import sha1
    import os, time
    
    #将session以全局变量的形式保存
    session_container = {}
    
    #创建cookie_str随机字符串  的函数
    create_session_id = lambda: sha1('%s%s' % (os.urandom(16), time.time())).hexdigest()
    
    
    class Session(object):
    
        #静态字段--session key名
        session_id = "__sessionId__"
    
        def __init__(self, request):
            #尝试获取__sessionId__
            session_value = request.get_cookie(Session.session_id)
            if not session_value:
                #获取失败,就创建随机字符串
                self._id = create_session_id()
            else:
                #成功---拿值
                self._id = session_value
            #最后设置cookie---"__sessionId__:随机字符串"
            request.set_cookie(Session.session_id, self._id)
    
        def __getitem__(self, key):
            return session_container[self._id][key]
    
        def __setitem__(self, key, value):
            if session_container.has_key(self._id):
                session_container[self._id][key] = value
            else:
                session_container[self._id] = {key: value}
    
        def __delitem__(self, key):
            del session_container[self._id][key]
    
    
    class BaseHandler(tornado.web.RequestHandler):
    
        def initialize(self):
            # my_session['k1']访问 __getitem__ 方法
            #实例session对象,实现索引访问
            self.my_session = Session(self)
    
    
    class MainHandler(BaseHandler):
    
        def get(self):
            print(self.my_session['c_user'])
            print(self.my_session['c_card'])
            self.write('index')
    
    class LoginHandler(BaseHandler):
    
        def get(self):
            self.render('login.html', **{'status': ''})
    
        def post(self, *args, **kwargs):
    
            username = self.get_argument('name')
            password = self.get_argument('pwd')
            if username == 'wupeiqi' and password == '123':
    
                self.my_session['c_user'] = 'wupeiqi'
                self.my_session['c_card'] = '12312312309823012'
    
                self.redirect('/index')
            else:
                self.render('login.html', **{'status': '用户名或密码错误'})
    
    settings = {
        'template_path': 'views',
        'static_path': 'static',
        'static_url_prefix': '/static/',
        'cookie_secret': 'aiuasdhflashjdfoiuashdfiuh',
        'login_url': '/login'
    }
    
    application = tornado.web.Application([
        (r"/index", MainHandler),
        (r"/login", LoginHandler),
    ], **settings)
    
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
  • 相关阅读:
    hive 总结一
    常见排序算法
    HBase 入门
    Spark:三种任务提交流程standalone、yarn-cluster、yarn-client
    YARN 原理简介
    Vue中v-show和v-if的使用以及区别
    JFinal Enjoy指令扩展管理常用文本模板
    JFinalSwagger插件
    layui table 表头和内容数据不能对齐
    start.sh在linux下启动报错 Can't connect to any repository: ,cannot open git-receive-pack
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5836381.html
Copyright © 2011-2022 走看看