深入探究Django中的Session与Cookie

前言

Cookie和Session相信对大家来说并不陌生,简单来说,Cookie和Session都是为了记录用户相关信息的方式,最大的区别就是Cookie在客户端记录而Session在服务端记录内容。

那么Cookie和Session之间的联系是怎么建立的呢?换言之,当服务器接收到一个请求时候,根据什么来判断读取哪个Session的呢?

对于Django默认情况来说,当用户登录后就可以发现Cookie里有一个sessionid的字段,根据这个key就可以取得在服务器端记录的详细内容。如果将这个字段删除,刷新页面就会发现变成未登录状态了。

对于Session的处理主要在源码django/contrib/sessions/middleware.py中,如下所示:

import time
from importlib import import_module
from django.conf import settings
from django.contrib.sessions.backends.base import UpdateError
from django.core.exceptions import SuspiciousOperation
from django.utils.cache import patch_vary_headers
from django.utils.deprecation import MiddlewareMixin
from django.utils.http import cookie_date
class SessionMiddleware(MiddlewareMixin):
 def __init__(self, get_response=None):
  self.get_response = get_response
  engine = import_module(settings.SESSION_ENGINE)
  self.SessionStore = engine.SessionStore
 def process_request(self, request):
  session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
  request.session = self.SessionStore(session_key)
 def process_response(self, request, response):
  """
  If request.session was modified, or if the configuration is to save the
  session every time, save the changes and set a session cookie or delete
  the session cookie if the session has been emptied.
  """
  try:
   accessed = request.session.accessed
   modified = request.session.modified
   empty = request.session.is_empty()
  except AttributeError:
   pass
  else:
   # First check if we need to delete this cookie.
   # The session should be deleted only if the session is entirely empty
   if settings.SESSION_COOKIE_NAME in request.COOKIES and empty:
    response.delete_cookie(
     settings.SESSION_COOKIE_NAME,
     path=settings.SESSION_COOKIE_PATH,
     domain=settings.SESSION_COOKIE_DOMAIN,
    )
   else:
    if accessed:
     patch_vary_headers(response, ('Cookie',))
    if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty:
     if request.session.get_expire_at_browser_close():
      max_age = None
      expires = None
     else:
      max_age = request.session.get_expiry_age()
      expires_time = time.time() + max_age
      expires = cookie_date(expires_time)
     # Save the session data and refresh the client cookie.
     # Skip session save for 500 responses, refs #3881.
     if response.status_code != 500:
      try:
       request.session.save()
      except UpdateError:
       raise SuspiciousOperation(
        "The request's session was deleted before the "
        "request completed. The user may have logged "
        "out in a concurrent request, for example."
       )
      response.set_cookie(
       settings.SESSION_COOKIE_NAME,
       request.session.session_key, max_age=max_age,
       expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
       path=settings.SESSION_COOKIE_PATH,
       secure=settings.SESSION_COOKIE_SECURE or None,
       httponly=settings.SESSION_COOKIE_HTTPONLY or None,
      )
  return response

当接收到一个请求时候,先在Cookie里取出key,然后根据key创建Session对象,在response时候判断是否要删除或者修改sessionid。

也就是说,Django中如果客户把浏览器Cookie禁用后,用户相关的功能就全都失效了,因为服务端根本没法知道当前用户是谁。

对于这种情况,关键点就是如何把sessionid不使用Cookie传递给客户端,常见的比如放在URL中,也就是URL重写技术。想实现这点可以自己写Middleware。不过django并不建议这么做:

The Django sessions framework is entirely, and solely, cookie-based. It does not fall back to putting session IDs in URLs as a last resort, as PHP does. This is an intentional design decision. Not only does that behavior make URLs ugly, it makes your site vulnerable to session-ID theft via the “Referer” header.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持

(0)

相关推荐

  • 在Django的session中使用User对象的方法

    通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供了工具来处理这样的常见任务(就像其他常见任务一样). Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话. 这个系统一般被称为 auth/auth (认证与授权)系统. 这个系统的名称同时也表明了用户常见的两步处理. 我们需要 验证 (认证) 用户是否是他所宣称的用户(一

  • 详解Python的Django框架中的Cookie相关处理

    浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生. cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies 来看看它是怎么工作的. 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样: GET / HTTP/1.1 Host: google.com ... 当 Google响应时,

  • Django 中 cookie的使用

    Cookie是浏览器在客户端留下的一段记录,这段记录可以保留在内存或者硬盘上.因为Http请求是无状态的,通过读取cookie的记录,服务器或者客户端可以维持会话中的状态.比如一个常见的应用场景就是登录状态.Django里面,对cookie的读取和设置很简单.Cookie本身的格式类似字典,因此可以通过request的key或者get获取:然后他的设置则是通过response对象的set_cookie设定; 如果要取消cookie,把过期时间设置为当前时间就行了. 获取Cookie: reque

  • Django中的cookie与session操作实例代码

    添加cookie: def login(req): if req.method=="POST": uf = UserInfoForm(req.POST) if uf.is_valid(): username = uf.cleaned_data["username"] password = uf.cleaned_data["password"] print username,password users = UserInfo.objects.fil

  • Django的session中对于用户验证的支持

    用户与Authentication 通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供了工具来处理这样的常见任务(就像其他常见任务一样). Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话. 这个系统一般被称为 auth/auth (认证与授权)系统. 这个系统的名称同时也表明了用户常见的两步处理. 我们需要 验证 (

  • 在Python的Django框架的视图中使用Session的方法

    SessionMiddleware 激活后,每个传给视图(view)函数的第一个参数``HttpRequest`` 对象都有一个 session 属性,这是一个字典型的对象. 你可以象用普通字典一样来用它. 例如,在视图(view)中你可以这样用: # Set a session value: request.session["fav_color"] = "blue" # Get a session value -- this could be called in

  • 在Django的视图(View)外使用Session的方法

    从内部来看,每个session都只是一个普通的Django model(在 django.contrib.sessions.models 中定义).每个session都由一个随机的32字节哈希串来标识,并存储于cookie中. 因为它是一个标准的模型,所以你可以使用Django数据库API来存取session. >>> from django.contrib.sessions.models import Session >>> s = Session.objects.g

  • 深入探究Django中的Session与Cookie

    前言 Cookie和Session相信对大家来说并不陌生,简单来说,Cookie和Session都是为了记录用户相关信息的方式,最大的区别就是Cookie在客户端记录而Session在服务端记录内容. 那么Cookie和Session之间的联系是怎么建立的呢?换言之,当服务器接收到一个请求时候,根据什么来判断读取哪个Session的呢? 对于Django默认情况来说,当用户登录后就可以发现Cookie里有一个sessionid的字段,根据这个key就可以取得在服务器端记录的详细内容.如果将这个字

  • 在django中,关于session的通用设置方法

    最近发现session的知识有点脱节了,默认设置愣是搞半天,看来忘了不少.今天把一些通用设置贴上来,以备随时回顾. 配置文件中设置默认操作(通用配置): SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN

  • Django中的session用法详解

    一.Session 的概念 cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用 Session 后,会在 Cookie 中存储一个 sessionid 的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到 sessionid 后,会根据这个值找出这个请求者的 Session. 二.Django 中 Session 的存储 session 键值对数据保存 session 的键值对数据默认保存在 dj

  • Django中使用session保持用户登陆连接的例子

    使用session保持用户登陆连接 在 view 中 login() 视图函数里增加如下语句 不允许重复登录语句 if request.session.get('is_login',None): return HttpResponseRedirect(reverse('index')) 一旦用户名和密码输入正确,就往 session 字典内写入用户状态和数据 request.session['is_login'] = True request.session['user_id'] = db_us

  • 浅析Django中关于session的使用

    一.Session的概念 cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session. 二.Django中session的使用 session键值对数据保存 session数据默认保存在django项目的一张数据库表中(表名为:djan

  • 深入理解PHP中的Session和Cookie

    在一个页面设置一个cookie时,必须刷新或到下一个页面才可以用 $_COOKIE 得到变量的值.原因是因为当页面第一次被浏览器访问载入时,页面中的 cookie 会被设置,将其发送存储到客户端指定的存储位置,所以$_COOKIE没有接收到客户端发送过来的 cookie 变量的值,当刷新或到下一个页面时,客户端会在页面程序在服务器端运行之前,发送与该地址相对应的 cookie到服务器端,所以 $_COOKIE 可以得到的值! 说白了就是当每一个页面被访问时,如果客户端找到了与访问地址相对应的 c

  • Tomcat中的Session与Cookie深入讲解

    前言 HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求.而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后续请求提供已登录信息的能力.本文首发于公众号顿悟源码. 解决办法就是使用 Cookie,它由服务器返回给浏览器,浏览器缓存并在每次请求时将 cookie 数据提交到服务器.Cookies 在请求中以明文传输,且大小限制 4KB,显然把所有状态数据保存在浏览器是不靠谱的,主流做法是: 浏览器发出

  • Django中cookie的基本使用方法示例

    前言 基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的一些信息:论坛作为 Internet发展的产物之一,在 Internet 中发挥着越来越重要的作用,是用户获取.交流.传递信息的主要场所之一,论坛常常也需要记录访问者的一些基本信息(如身份识别号码.密码.用户在 Web 站点购物的方式或用户访问该站点的次数).目前公认的是,通过 Cookie 和 Session 技术来实现记录访问者的一些基本信息. 下面就来一起看看Django中coo

  • Django中Cookie搭配Session使用实践

    目录 Cookie的作用 Cookie登录的实现过程 Cookie的安全隐患 Session的引进 Session的启用 Session的使用 Session搭配Cookie使用 Cookie的作用 前面我们说道Django实战006:Cookie设置及跨域问题处理,Cookie可以在浏览器端保存用户数据,当用户访问服务器时会提交Cookie给服务器,Cookie附加了当前状态, 服务器可以通过Cookie来标识用户的登录状态,起到简单的用户身份识别和用户信息记录等作用. Cookie登录的实现

  • Flask框架中的session设置详解

    目录 Flask中的session session设置 关于session的设置 cookies中的session session序列化机制 session反序列化机制 session的使用和验证 Flask中的session session设置 Flask除请求对象之外,还有一个 session 对象. 它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥. 我们知道,在django中的session

随机推荐