zoukankan      html  css  js  c++  java
  • 浅谈cookie 和 session

    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
      

  • 相关阅读:
    java内部类_让你一看就明白_再也不用困惑啦
    hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换)
    未曾谋面却完成了短信发送功能_API是个好中介
    日历(Calendar)_java版(某年的日历,某月的日历)_用户完全自定义
    让你的网站拥有微博(weibo.com)关注图标
    一个demo告诉你优化算法的强大
    给你八分钟搞定dedeCMS(织梦内容管理系统)
    SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
    oracle数据库:jdbc通用sql分页封装
    浅析HTTP协议
  • 原文地址:https://www.cnblogs.com/zengyi1995/p/11234692.html
Copyright © 2011-2022 走看看