欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

cookie 和 session

程序员文章站 2022-06-15 13:30:24
一、 cookie 1. 定义:保存在浏览器本地上的一组组键值对 2. 特点: 由服务器让浏览器进行设置的 浏览器保存在浏览器本地 下次访问时自动携带 3. 应用: 登录 保存浏览习惯 简单的投票 4. 使用cookie的原因:因为HTTP是无状态的,用cookie来保存状态 5. 在django中 ......
  1. 定义:保存在浏览器本地上的一组组键值对

  2. 特点:

    • 由服务器让浏览器进行设置的
    • 浏览器保存在浏览器本地
    • 下次访问时自动携带
  3. 应用:

    • 登录
    • 保存浏览习惯
    • 简单的投票
  4. 使用cookie的原因:因为http是无状态的,用cookie来保存状态

  5. 在django中操作cookie

    • 设置cookie:

      # httpresponse,render也可以
      ret = redirect('/index')
      ret.set_cookie('key',value,...)        # set-cookie:key=value
      ret.set_signed_cookie('key',value,salt='加密盐',...)
      • 参数:
        • key,键
        • value='',值
        • max_age=none,超出时间
        • expires=none,超出时间(针对于ie浏览器)
        • path='/',cookie生效的路径,/表示根路径
        • domain=none,cookie生效的域名
        • secure=false,https传输
        • httponly=false,只能http协议传输,无法被javascript获取
    • 获取cookie:

      request.cookies.get('key')
      request.get_signed_cookie('key',salt='加密盐',default=raise_error,max_age=none)
      • 参数:
        • default:默认值
        • salt:加密盐
        • max_age:后台控制过期时间
      • 注意:获取时的加密盐要和设置时的加密盐相同,否则无法获取到正确的数据
    • 删除cookie:

      def logout(request):
          ret = redirect("/login/")
          ret.delete_cookie("key")       # 删除用户浏览器上之前设置的cookie值
          return rep
  6. cookie版登陆校验

    from django.shortcuts import render, redirect, httpresponse
    from django.views import view
    
    class login(view):
        def get(self, request, *args, **kwargs):
            return render(request, 'login.html')
    
        def post(self, request, *args, **kwargs):
            username = request.post.get('username')
            pwd = request.post.get('pwd')
            if username == 'alex' and pwd == '123':
                url = request.get.get('return_url')
                if url:
                    ret = redirect(url)
                else:
                    ret = redirect('/index/')
                # 设置 cookie
                # ret['set-cookie'] = 'is_login=100; path=/'
                ret.set_cookie('is_login', '1')      # 不加密的     set-cookie: is_login=1; path=/
                ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,)     # 加密的
                return ret
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    
    # 登录验证装饰器
    def login_required(func):
        def inner(request, *args, **kwargs):
            # 获取 cookie
            is_login = request.cookies.get('is_login')       # 不加密的
            is_login = request.get_signed_cookie('is_login', salt='s21', default='') # 加密的
            print(is_login)
            url = request.path_info
            if is_login != '1':
                return redirect('/login/?return_url={}'.format(url))
            # 已经登录
            ret = func(request, *args, **kwargs)
            return ret
        return inner
    
    # 在需要在需要登录才能访问到页面的视图上加装饰器
    @login_required
    def index(request):
        return httpresponse('首页')
    
    @login_required
    def home(request):
        return httpresponse('home')
    
    def logout(request):
        ret = redirect('/login/')
        ret.delete_cookie('is_login')
        return ret

二、 session

  1. 定义:保存在服务器上的一组组键值对(必须依赖cookie来使用)

  2. 使用session的原因:

    • cookie保存在浏览器本地,不安全
    • cookie保存的大小个数受到限制(cookie本身最大支持4096字节)
  3. 总结:cookie弥补了http无状态的不足,但是cookie以文本的形式保存在浏览器本地,自身安全性较差,所以我们通过cookie识别不同用户,对应的在session里保存私密信息以及超过4096字节的文本

  4. 在django中操作session

    • 设置session:
    request.session['key'] = value
    request.session.setdefault('key',value) # 设置默认值,存在则不设置
    • 获取session:
    request.session['key']
    request.session.get('key',none)
    • 删除session:
    del request.session['key']
    • 其他操作:
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的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失效策略
  5. session版登陆验证

    from django.shortcuts import render, redirect, httpresponse
    from django.views import view
    
    class login(view):
        def get(self, request, *args, **kwargs):
            return render(request, 'login.html')
    
        def post(self, request, *args, **kwargs):
            username = request.post.get('username')
            pwd = request.post.get('pwd')
            if username == 'alex' and pwd == '123':
                url = request.get.get('return_url')
                if url:
                    ret = redirect(url)
                else:
                    ret = redirect('/index/')
                # 设置 session
                request.session['is_login'] = 1      # value可以设置为数字
                # 设置会话session和cookie的超时时间,0表示用户关闭浏览器session就会失效
                # request.session.set_expiry(0)
                return ret
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    
    # 登录验证装饰器
    def login_required(func):
        def inner(request, *args, **kwargs):
            # 获取 session
            is_login = request.session.get('is_login')
            print(is_login)
            url = request.path_info
            if is_login != 1:
                return redirect('/login/?return_url={}'.format(url))
            # 已经登录
            ret = func(request, *args, **kwargs)
            return ret
        return inner
    
    # 在需要在需要登录才能访问到页面的视图上加装饰器
    @login_required
    def index(request):
        # request.session.session_key:会话session的key
        request.session.clear_expired()      # 将失效的数据删除
        return httpresponse('首页')
    
    @login_required
    def home(request):
        return httpresponse('home')
    
    def logout(request):
        ret = redirect('/login/')
        request.session.delete()     # 删除session数据  不删除cookie
        request.session.flush()      # 删除session数据  并删除cookie
        return ret
  6. django中的session配置

    • 全局配置:from django.conf import global_settings
    1. 数据库session
    session_engine = 'django.contrib.sessions.backends.db'     # 引擎(默认)
    
    2. 缓存session
    session_engine = 'django.contrib.sessions.backends.cache'  # 引擎
    # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    session_cache_alias = 'default'      
    
    3. 文件session
    session_engine = 'django.contrib.sessions.backends.file'    # 引擎
    # 缓存文件路径,如果为none,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    session_file_path = none
    
    4. 缓存+数据库
    session_engine = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密cookie session
    session_engine = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    # session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    session_cookie_name = "sessionid"
    # session的cookie保存的路径(默认)
    session_cookie_path = "/"
    # session的cookie保存的域名(默认)
    session_cookie_domain = none
    # 是否https传输cookie(默认)
    session_cookie_secure = false
    # 是否session的cookie只支持http传输(默认)
    session_cookie_httponly = true
    # session的cookie失效日期(2周)(默认)
    session_cookie_age = 1209600
    # 是否关闭浏览器使得session过期(默认)
    session_expire_at_browser_close = false
    # 是否每次请求都保存session,默认修改之后才保存(默认)
    session_save_every_request = false