• cookie与session组件


     

    #cookie
    是由浏览器维持,存储在客户端的一小段文本信息。用户每次访问站点时,web服务都可以读取cookie中的信息
    cookie根据生命周期分为会话cookie和持久cookie。//todo
    
    #session
    中文翻译为会话。在服务器上保存用户操作的历史信息。服务器会使用类似散列表的结构保存信息,每一个网站客户都会被分配一个唯一的标识符sessionID,它可以通过url传递,或者保存在客户端的cookie中。
    
    服务器为某个客户端请求创建一个session时,会先检查客户端的请求里是否包含sessionID, 如果包含,说明已经创建过session,服务器按照sessionID将session检索出来使用; 如果客户端请求不包含sessionID,则为此服务创建一个session并同时生成一个与此session定向管理的sessionID,在本次的响应中返回给客户端。
    
    一般sessionID存放在cookie中。Cookie和Session通过一个sessionID建立起浏览器和服务器之间的连接。
    
    #为什么使用它们
    web开发中,http协议是无状态的,可以使用cookie和session确定哪些连接是和该用户相关
    
    #session和cookie的区别
    1.cookie把数据存储在客户端(网站的客户端是浏览器),session把数据存储在服务器。
    2.session数据的安全系数比cookie高。
    3.生命周期不同,一般是用临时session,生命周期是随着浏览器关闭而结束,cookie的生命周期是可以设置的,随着设置时间的结束而结束。
    
    #总结:
    Session和cookie的目的相同,都是为了克服HTTP协议的无状态缺陷,但完成方法不同。Session通过cookie,在客户端保存sessionID,而将用户的其他会话消息保存在服务端的session对象中,与此相对的,cookie需要将所有信息都保存在客户端。因此cookie存在这一定的安全隐患。
    
    #什么是token
    token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
    当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
    简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。
    cookie,session.token

     

    一、cookie基本介绍

    #1、cooike的由来
        因为HTTP是无状态的,每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
        会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
    
    
    #2、什么是cooike
         Cookie是由服务器创建,存储在浏览器上的K,V键值对
    
    
    #3、cooike规范
        # Cookie大小上限为4KB; 
        # 一个服务器最多在客户端浏览器上保存20个Cookie; 
        # 一个浏览器最多保存300个Cookie; 
        但是,浏览器大战的今天,一些浏览器对Cookie规范“扩展”了一些,
    
        #注意,不同浏览器之间是不共享Cookie的
    
    #4、Cookie的覆盖 
        如果服务器端发送重复的Cookie那么会覆盖原有的Cookie
    cooike了解知识点

    二、Cookie的基本使用

    1、设置cookie

    #key, 键
    #value='', 值
    #max_age=None, 
        传一个秒的时间,例如:max_age=60*60*24*6,       6天
    #expires=None, 
        超时时间(传一个datatime对象)
    #path='/', 
        Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
    
    #domain=None,
         Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如,             domain=".example.com"所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 如果该参数设置为 None ,cookie只能由设置它的站点读取
    
    #secure=False,
         浏览器将通过HTTPS来回传cookie
    #httponly=False
         只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    #HttpResponse对象都可以设置
    
    rep = HttpResponse(‘ok')
    rep = render(request, ...)
    
    rep.set_cookie(key,value)
    rep.set_signed_cookie(key,value,salt='加密盐')
    
    #不加盐
    set_cookie(key,value)
    
    def get_cookie(request):
        obj = HttpResponse('ok')
        obj.set_cookie('name','pdun')
        return obj
    
    #加盐
    obj.set_signed_cookie('name','pdun',salt='123')
    
    #把salt加密后放到冒号后边
        name=pdun:1haqZh:TGY_X30GGFUPLC1SE6Sl18g7aSU
    View Code

     

    2、获取cookie

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)     #加密时有salt
     
    #参数:
        default: 默认值
        salt: 加密盐
        max_age: 后台控制过期时间

    3、删除Cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep

    Cookie版登录校验

    def login_auth(func):
        def inner(request,*args,**kwargs):
            next_url=request.get_full_path()
            if request.COOKIES.get('is_login'):
                return func(request,*args,**kwargs)
            else:
                return redirect('cookie_login/?next=%s'%next_url)
        return inner
    @login_auth
    def cookie_order(request):
        return HttpResponse('我是订单页面')
    @login_auth
    def cookie_index(request):
        name=request.COOKIES.get('username')
        return render(request,'cookie_index.html',{'name':name})
    def cookie_login(request):
        if request.method =='POST':
            next_url=request.GET.get('next')
            name=request.POST.get('name')
            password=request.POST.get('password')
            if name == 'lqz' and password == '123':
                import datetime
                now=datetime.datetime.now().strftime('%Y-%m-%d %X')
                print(now)
                obj=redirect(next_url)
                obj.set_cookie('is_login',True)
                obj.set_cookie('username',name)
                obj.set_cookie('login_time',now)
                return obj
    
        return render(request, 'cookie_login.html')
    登录认证装饰器

    三、Session的基本介绍

    什么是session

    #存在服务器上的键值对       {'随机字符串':{name:pdun,pwd:123}} 
    解决cookie不安全的问题,
    用session必须跟cookie连用

    Django中Session基本使用

    设置值

    request.session['name']='pdun'
    request.session['age']='1'
    
    #如果设置多个,它会以字典的形式存储到session表中的session_data中
    #django自动创建session表
    
    
    
    #生成session时,django框架会做三件事
        1 生成随机字符串(一个浏览器对应一个)
        2 取数据库存储         
        3 将随机字符串写到浏览器的cookie中(session_id)
                写入cookie(set_cookie('sessionid','dfasfasdfa'))    

    取值

    #取值
        name=request.session['name']
    #执行流程:
        取到cookie的随机字符串
        取session表中根据随机字符串查询,查询出session_data这个字典,然后把字典中name返回

     删除值

    # 只是删除数据库部分的内容
        request.session.delete()
    #既删除cookie,又删除数据库
        request.session.flush()
    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    
    
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    # 取到随机字符串,浏览器带过来的cookie的值
    request.session.session_key
    
    # 清除失效的session
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据(只删数据库)
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
    request.session.flush() 
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

    Django中的Session配置

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

    思考,如果第二个人再次再同一个浏览器上登录,django-session表会怎样?

    CBV中加装饰器

    from django import views
    from django.utils.decorators import method_decorator
    # @method_decorator(login_auth,name='get')
    # @method_decorator(login_auth,name='post')
    class UserList(views.View):
        # @method_decorator(login_auth)
        def dispatch(self, request, *args, **kwargs):
            obj=super().dispatch(request, *args, **kwargs)
            return obj
    
        @method_decorator(login_auth)
        def get(self,request):
            return HttpResponse('我是用户列表')
    
        def post(self,request):
            return HttpResponse('我是用户列表')

    前端存取cooike

    vuex:状态管理器
    
    如果没有安装,
    #1、安装
        npm install vues
    
    #2、在src中创建store.js文件
    
    #3、在main.js中注册
    new Vue({
      router,
      store,
    
    
    
    ----------------------------
    import Vue from 'vue'
    import Vuex from 'vuex'
    import Cookie from 'vue-cookies'      //下载cookies并导入
    Vue.use(Vuex)
    
    export default new Vuex.Store({
        //存储全局变量
        state: {
            //name:''      
            //pwd:''       
    
    #这里相当于全局变量,后边给它赋值,后边取值,但是登陆一次后,刷新页面,需要重新登陆
    vuex:状态管理器
    npm install vue-cookies
    
    
    
    ---------------------------
    #store.js
    import Cookie from 'vue-cookies'      //下载cookies并导入
    export default new Vuex.Store({
    
        state: {
            //不要写死,要从cookie中取
            name: Cookie.get('name'),
            token: Cookie.get('token')
    
        },
        mutations: {
            //    写方法,这里面写的所有方法,第一个参数,必须是state
            //login这个方法写好了,怎么调用, _this.$store.commit('login',response),
            // 就用commit第一个参数,就是这里的函数名,第二个参数是这里需要的参数
            login:function (state,response) {
                //修改这两个变量的值
                state.name=response.data.name
                state.token=response.data.token
            //    往cookie中写数据
                Cookie.set('name',response.data.name)
                Cookie.set('token',response.data.token)
            },
            logout:function (state) {
                //修改这两个变量的值
                state.name=""
                state.token=""
            //    往cookie中写数据
                Cookie.set('name',"")
                Cookie.set('token',"")
            }
    
    
        },
        actions: {}
    })
    vue-cookies
  • 相关阅读:
    pythos.access()
    CSS简笔画:纯CSS绘制一艘邮轮
    【每日坚果】如何成为一名数据工匠?
    【博客园使用小指南】DIY美化博客园小指南--主题设置
    乐字节Java反射之一:反射概念与获取反射源头Class
    乐字节Java面向对象三大特性以及Java多态
    在乐字节学习的一天(持续跟新……)
    在乐字节学习的一天(持续跟新……)
    乐字节Java变量与数据类型之二:Java常量与变量
    乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符
  • 原文地址:https://www.cnblogs.com/pdun/p/10753781.html
Copyright © 2020-2023  润新知