zoukankan      html  css  js  c++  java
  • flask之cookie与session区别

      用户身份校验是web访问时的重要步骤。常用的身份校验方式有cookie,session和jwt三种。其中cookie和session是较传统的校验方式,其采用将用户信息保存在服务器或浏览器中,用户访问时,携带相关信息,有服务器进行校验。最近流行的JWT令牌是一种分布式的跨域验证机制造。其允许跨域,另外将token保存到浏览器,避免了采用数据库保存用户信息。在分布式服务器运行场合,其校验更加简单,高效。其由头部,载荷和签名三部分组成。头部一般是token的类型、加密方式的声明信息;载荷部分是token的用户身份信息,头部和载荷均采用base64算法进行加密。通过base64解密即可查阅用户信息,因此一般存放的是用户非机密信息。签名部分是通过将头部,载荷部分以及用户的加密字段进行加密生成的字符串,这部分信息用来验证令牌的有效性。

    1.flask中session的保存有两种:自带的session类和flask_session包。自带的session类中,其session信息是保存在浏览器内,而非客户端。而采用flask_session包可以改变session的存储位置,可以存储到redis,sqlalchemy,mongodb,缓存等数据库中。利用session记录用户登录次数:

    app=Flask(__name__)
    app.secret_key="hellobaby"#用于加密session信息
    
    #用户登陆后设置session信息
    @app.route("/user")
    def index():
        session["name"]="hello,user"
        session["count"]=1
    
        return "hello,"
    
    #记录用户登陆的次数,
    @app.route("/hello")
    def user():
        name=session.get("name")
        count=session.get("count")
        print(count,9999)
        if not all([name,count]):
            return "请登陆"
        num=count+1
        session["count"]=num
        return str(num)
    
    if __name__ == '__main__':
        app.run(port=5006)
    
    结果:查询session信息,因是加密,信息较安全。
    
    Cookie:session=eyJjb3VudCI6MSwibmFtZSI6ImhlbGxvLHVzZXIifQ.EBTDCw.SKWftLjBdc-IiGlWqcgrS16BzHg

    2.利用cookie记录用户登录次数

    #用户登陆后设置cookie信息
    @app.route("/user")
    def index():
        resp=Response("hello")
        resp.set_cookie("name","user1",3600)
        resp.set_cookie("count", "1", 3600)#cookie的值1为str
        return resp
    
    #记录用户登陆的次数,
    @app.route("/hello")
    def user():
        name=request.cookies.get("name")
        count=request.cookies.get("count")
        print(count,9999)
        if not all([name,count]):
            return "请登陆"
        num=str(int(count)+1)
        resp=Response(num)
        resp.set_cookie("count", num, 3600)
        return resp
    
    if __name__ == '__main__':
        app.run(port=5006)

    调试:
    虽然cookie可以保存用户信息,但信息较透明,容易被窃取。例如 获取到的信息: Cookie:name=user1; count=4



     3.基于flask_session包进行session信息的保存,其可以选择将session信息保存在redis,缓存或sqlalchemy,关系型数据库等。

    app=Flask(__name__)
    # app.secret_key="hellobaby"#用于加密session信息
    class App_Config():
        SECRET_KEY="20e4f6b0-b631-4582-b2e0-00190c7d006f"
        SESSION_TYPE="redis"
        SESSION_PERMANENT=False
        SESSION_USE_SIGNER=True
        PERMANENT_SESSION_LEFTTIME=86400*2
        SESSION_REDIS=StrictRedis(host="127.0.0.1",port=6379)#建立redis连接
    
    app.config.from_object(App_Config)
    session1=Session(app)
    
    
    #用户登陆后设置cookie信息
    @app.route("/user")
    def index():
        session["name"]="user1"
        session["count"]=1
        return " login sccess"
    
    #记录用户登陆的次数,
    @app.route("/hello")
    def user():
        name=session.get("name")
        count=session.get("count")
        print(count,9999)
        if not all([name,count]):
            return "请登陆"
        num=str(int(count)+1)
        resp=Response(num)
        session["count"] = num
        return resp
    
    if __name__ == '__main__':
        app.run(port=5006)
  • 相关阅读:
    java初学者之java语言主要知识点三
    C++类的对象和类的指针的区别
    win32多线程: 线程创建与结束等待
    多线程学习:win32多线程编程基本概念(转)
    C++常用数据类型和Windows常见数据类型
    VC++2017关于项目出现"const char *" 类型的实参与 "char *" 类型的形参不兼容错误的解决方法
    Linux环境下vi/vim编辑器常用命令
    c++学习笔记之类模板
    c++学习笔记之函数重载和模板理解
    c++学习笔记之多态和虚函数
  • 原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/11140974.html
Copyright © 2011-2022 走看看