zoukankan      html  css  js  c++  java
  • cookie和session的区别及在Django中应用

    Django中Cookie和session应用

    1. 什么是cookie?

      cookie是客户端浏览器上的一个文件,以键值对进行保存,类似于字典的 {'key' : 'value'} ,与服务器端没有关系,当浏览器访问服务器时候,服务器会生成一个随机字符串保存在cookie中返回给客户端,这样当客户端浏览器下次访问服务器端的时候,就会带着这个保存了服务器端的随机字符串的cookie访问服务器,服务器收到请求后,经过检查此cookie,标识此客户端为已通过认证的状态,可以直接登录。

    2. cookie的作用?

      因为web端是通过HTTP协议进行连接,由于HTTP协议的无状态,无连接性质,所以在同一客户端先后两次请求就会产生无逻辑可循的问题,cookie可以解决无状态无连接导致的问题。

    3. cookie常用参数

      key: 键

      value: 值

      max_age: cookie 的过期时间,多久后过期,时间为秒

      expires: 过期时间,为具体的时间 格式化的时间

      path: 生效的路径,该路径下的子路径也生效

      domain: 生效的域名

      secure: 可设置布尔值, 当设置为False时只能用HTTP协议传输,HTTPs用True

      httponly: 可设置布尔值,False表示JavaScript不能访问该cookie

    4. Django  中  Cookie  的具体应用

      # Djano中设置cookie
      from djano.shortcuts import render, redirect, HttpResponse
      # 设置 cookie 需要用  HttpResponse 对象
      response = HttpResponse('ok')   
      response.set_cookie('user', 'ming')  # 设置cookie
      response.set_cookie('is_login', True) 
      ​
      # 获取cookie通过request对象
      user = request.COOKIE.get('user', None)
      is_login = request.COOKIE.get('is_login', None)
      ​
      # 删除cookie使用 httpResponse对象
      response.delete_cookie('is_login')
      ​
      ​
      ​
      # session应用
      # 在视图函数中通过request对象操作session
      # 1. 设置session
      request.session['key1'] = 'value1'
      request.session['key2'] = 'value2'
      # 过程:
      # i) 生成一个随机字符串,作为主键
      # ii) 在django_session表中插入有三个字段的一条数据(一条数据对应一个浏览器会话)
          -- session_key:主键-随机字符串
          -- session_data:该会话拥有的所有key-value形成的大字典的加密字符串
          -- expire_date:过去时间,默认14天
      # iii) 往浏览器中写入一条cookie,sessionid=主键的随机字符串
      # 2. 获取session
      request.session.get('key', None)
      ​
      # 3. 删除session
      request.session.delete()  # 只删除当前会话对应的一条记录
      request.session.flush()  # 除了删除当前会话对应的一条记录外,还删除对应浏览器中的cookie,建议使用
      # 4. 清除django-session表中所有过期的session字段
      request.session.clear_expired()  # 情况所有过去的Session
      # 5. 了解
      request.session.session_key  # 获取当前会话对应的session_key
      request.session.exists('session_key')  # 判断某session_key是否存在
      ​
      ​
      ​
      # session的配置
      # 1. 数据库存储
      # SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)
      #
      # 2. 缓存存储
      # SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
      # SESSION_CACHE_ALIAS = 'default'  # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
      #
      # 3. 文件存储
      # SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
      # SESSION_FILE_PATH = '/'  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
      #
      # 4. 缓存 + 数据库存储
      # SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # 引擎
      #
      # 5. 加密Cookie
      # SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'  # 引擎
      #
      # SESSION_COOKIE_NAME = "sessionid"  # cookie的key名,值为随机字符串
      # SESSION_COOKIE_PATH = "/"  # 作用路径,/代表所有路径下均起作用)
      # SESSION_COOKIE_DOMAIN = None  # 作用域名
      # SESSION_COOKIE_SECURE = False  # 布尔类型,浏览器是否通过HTTPS方式回传cookie
      # SESSION_COOKIE_HTTPONLY = True  # 布尔类型,JS能否直接访问该条cookie
      # SESSION_COOKIE_AGE = 1209600  # 数据库session字段的过期时间
      # SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 浏览器关闭后cookie是否过期,默认False不过期,建议True
      # SESSION_SAVE_EVERY_REQUEST = False  # 每一次请求,是否更新session字段的过期时间,默认False不更新,建议True
    5. session和cookie的异同点

      1cookie采用的是在客户端保持状态的方案,session采用的是在服务器端保持状态的方案。
      2、正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示,浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本也可以生成cookie。
      3、cookie的生命期为浏览器会话期间,即关闭浏览器窗口,cookie就消失。

      4、当程序需要为某个客户端请求创建一个session时,服务器首先检查这个客户端的请求里是否包含一个session标识(session id),如果包含则说明以前已经为该客户端创建过session,服务器就按照session id 将这个session检索出来使用,检索不到就会新建一个。

      5、经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器
      会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
      <form name="testform" action="/xxx">
      <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
      <input type="text">
      </form>
      实际上这种技术可以简单的用对action应用URL重写来代替。

      cookie 和session 的区别:
      1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
      2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
        考虑到安全应当使用session。
      3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
        考虑到减轻服务器性能方面,应当使用COOKIE。
      4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
      5、所以个人建议:
        将登陆信息等重要信息存放为SESSION
        其他信息如果需要保留,可以放在COOKIE中
    6. 总而言之,cookie/session的出现就是为了解决http协议无状态的弊端,为了让客户端和服务端建立长久联系而出现的。

  • 相关阅读:
    Python基础知识2-内置数据结构(上)
    vs code的快捷方式
    vs code配置
    vs code安装
    web浏览器兼容问题
    js正則表達式
    MVC MVP MVVM
    vue-cli(vue脚手架)
    web攻擊
    web前端面試題
  • 原文地址:https://www.cnblogs.com/5j421/p/10524389.html
Copyright © 2011-2022 走看看