django_session表_cookie和session详解

django_session表_cookie和session详解前言session:session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,session是一个思路、一个概念、一个服务器存储授权信息的解

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

session: sessioncookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,session是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储数据不安全的问题的。
 

cookie和session的使用

web开发发展至今,cookiesession的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

  • 存储在服务端:通过cookie存储一个sessionid,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个sessionid,下次再次请求的时候,会把该sessionid携带上来,服务器根据sessionid在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。Django把session信息默认存储到数据库中,当然也可以存储到其他地方,比如缓存中,文件系统中等。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
  • session数据加密,然后存储在cookie中。这种专业术语叫做client side sessionflask框架默认采用的就是这种方式,但是也可以替换成其他形式。

 

django中应用session

 

1.启用session

要应用session,必须开启session中间层,在settings中:

MIDDLEWARE = [
    # 启用 Session 中间层
    'django.contrib.sessions.middleware.SessionMiddleware',
]

 

2.session的5种存储机制

默认情况下,session数据是存储到数据库中的。我们如何得知呢?可以从Django的默认配置中查看到,Django的默认配置路径是from django.conf import global_settings,我们可以打开然后查看到默认配置,代码如下:

# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = 'sessionid'
# Session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# Session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# Session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = '/'
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 存储session数据默认使用的模块
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# session数据的序列化类
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

这里我们可以看到SESSION_ENGINE = 'django.contrib.sessions.backends.db'django默认使用的是存储到数据库中,这只是存储机制中的其中一种,下面我们逐一介绍
 

1.数据库方式

使用数据库。默认就是这种方案。

# 数据库方式(默认):
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   

# 数据库类型的session引擎需要开启此应用,启用 sessions 应用
INSTALLED_APPS = [
    'django.contrib.sessions',
]

 

2.缓存

使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在settings.py中配置好CACHES,并且是需要使用Memcached,而不能使用纯内存作为缓存。

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'   

 

3.缓存+数据库

在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' 

 

4.文件

使用文件来存储session

SESSION_ENGINE = 'django.contrib.sessions.backends.file' 

# 设置文件位置, 默认是 tempfile.gettempdir(),
# linux下是:/tmp
# windows下是: C:\Users\51508\AppData\Local\Temp
SESSION_FILE_PATH = 'd:\session_dir'

 

5.加密cookie

基于cookie的session,所有数据都保存在cookie中,一般情况下不建议使用这种方式

  1. cookie有长度限制,4096个字节
  2. cookie不会因为服务端的注销而无效,那么可能造成攻击者使用已经登出的cookie模仿用户继续访问网站
  3. SECRET_KEY这个配置项绝对不能泄露,否则会让攻击者可以远程执行任意代码
  4. cookie过大,会影响用户访问速度
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

 

3.操作session

  1. get:用来从session中获取指定值。
  2. pop:从session中删除一个值。
  3. keys:从session中获取所有的键。
  4. items:从session中获取所有的值。
  5. clear:清除当前这个用户的session数据。
  6. flush:删除session并且删除在浏览器中存储的session_id,一般在注销的时候用得比较多。
  7. set_expiry(value):设置过期时间。
  • 整形:代表秒数,表示多少秒后过期。
  • 0:代表只要浏览器关闭,session就会过期。
  • None:会使用全局的session配置。在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
  1. clear_expired:清除过期的session。Django并不会清除过期的session,需要定期手动的清理,或者是在终端,使用命令行python manage.py clearsessions来清除过期的session

 

实战案例

session其实本质也是基于cookie使用的,使用起来跟session差不多,先创建3个路由地址

urlpatterns = [
    path('set_session/', views.set_session, name='set_session'),
    path('get_session/', views.get_session, name='get_session'),
    path('clear_session/', views.clear_session, name='clear_session')
]

然后编写对应的视图

def set_session(request):
    """设置session"""
    request.session["username"] = "jkc"
    return HttpResponse("session_view")


def get_session(request):
    """获取session"""
    username = request.session.get("username")
    return HttpResponse(f"session的值为{username}")


def clear_session(request):
    """清除session"""
    request.session.clear()
    return HttpResponse("清除session成功")

接着我们在浏览器上先打开F12,然后输入url地址http://127.0.0.1:8000/session/set_session/,我们可以看到响应头中有后台返回的set-cookie里面有个sessionid,这个sessionid就是前端传给后台,后台经过一系列加密操作后返回给前端浏览器的key
django_session表_cookie和session详解
因为我们django默认存储session的机制是数据库,所以数据库中的django_session表中也会有同样key的一条数据
django_session表_cookie和session详解
 

接着我们在浏览器上访问http://127.0.0.1:8000/session/get_session/,浏览器页面上会返回session的值为jkc,说明我们的session的key是正确的,且没有过期。
 
最后再访问http://127.0.0.1:8000/session/clear_session/,浏览器页面返回清除session成功,如何证明呢?我们可以再次访问http://127.0.0.1:8000/session/get_session/,我们会发现这次返回的是session的值为None,值为None说明session已经被清空

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164907.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nurtas aidarbekov_true image2018

    nurtas aidarbekov_true image2018Up主作为CV穷人代表,这一次想要触碰一下papers里最为活跃却又以“Huge”令穷人望而生畏的超级数据集:ImageNet中的ILSVRC2012.还记得依靠氪金“霸道总裁式”碾压一切“noise2image”的BigGAN吗?来不及时间解释了,快上车!##下载可怜穷人的BigGAN-4~8gpusversion>>gitcl…

    2022年10月9日
    0
  • Unity–Cinemachine官方实例详解

    Unity–Cinemachine官方实例详解1.2DCamera搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create2DCamera,在生成的相机中设置follow,同时注意body的设置,如下图所示在虚拟相机中还需要添加Cinemachineconfiner组件,点击下图中的AddExtension,在弹出的下拉列表中,选择CinemachineConfiner。用来后处…

    2022年5月8日
    48
  • 了解ACL—通配符掩码「建议收藏」

    了解ACL—通配符掩码「建议收藏」学习ACL,搞懂ACL就不能不搞定wildcardmask,通配符掩码。说简单点,通配符掩码就是0为绝对匹配,必须严格匹配才行,而1为任意,从某种意义上讲,如果一个8位上有一个1字符,那也只有两种方式,0或者1,但是如果进行组合,那么方式就多了。举例说明吧。一般我们在应用上都是进行地址块的匹配,怎么讲呢?就是说:1)对某个ABC类网进行匹配或者教通配符屏蔽2)对某个子网应用ACL。…

    2022年7月19日
    8
  • Android NDK开发:打包so库及jar包供他人使用

    Android NDK开发:打包so库及jar包供他人使用Android的NDK开发相信各位已经精通各种姿势了。不过基本上都是那种native代码和java代码都在同一个工程中,因为应用从头到脚都是我们自己的,也不需要分离。但有时候可能需要我们自己把某些库打包起来供别人使用,或者使用别人提供给我们的库。本篇文章及下篇文章就讲讲so库如何打包。一、目标及方式这篇文章会讲第一种方式来打包so库,这种方式是基于jni层的,需要我们同时提供接口的jar包…

    2022年6月22日
    145
  • linux上lrzsz工具的安装与使用[通俗易懂]

    linux上lrzsz工具的安装与使用[通俗易懂]lrzsz官网入口:https://ohse.de/uwe/software/lrzsz.htmllrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux系统之间的文件传输,体积小速度快。1.安装:root用户下输入安装命令:yuminstall-ylrzsz安装完毕2.上传文件:终端输入rz…

    2022年6月23日
    41
  • 单点登录SSO解决方案之SpringSecurity+JWT实现

    单点登录SSO解决方案之SpringSecurity+JWT实现  通过前面几天文章我们详细的介绍了SpringSecurity的使用,本文我们来看下,结合JWT来实现单点登录操作。一、什么是单点登陆  单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统二、简单的运行机制  单点登录的机制其实是比较简单的,用一个现实中的…

    2022年5月21日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号