中文drupal教程(4)Session会话系统

news2024/11/24 11:25:15

  

Session(会话)在网站中扮演非常重要的角色,储存临时用户数据、登录数据等等都用到了它,Drupal使用到了Symfony的Session组件,该组件非常强大灵活,drupal在此基础上有所改造和扩展,要理解Symfony的Session组件让我们先从原生php的Session机制说起:

php原生的Session采用服务器文件系统储存用户会话数据,这对一般小型网站足够了,但php做的远非如此,它提供了一整套机制让用户可以自定义Session的实现,比如加密储存、数据放数据库等等,我们看一看PHP的Session是如何实现的:

实现Session有7个方法open, close, read, write, destroy, gc , create_sid,不管是原生、php扩展、还是用户自定义机制都是使用它们,使用session_set_save_handler()函数注册后,Session机制就会调用这些方法使用它们内部定义的逻辑去储存会话数据,关于详细信息请看官方文档,在php5.4开始php定义了Session处理器接口SessionHandlerInterface以及此接口的默认实现 SessionHandler ,用户可以自己去实现该接口,接口定义了以上7个方法,这些方法会被php内部自动调用,无需用户干预,php会把调用结果填充到$_SESSION超全局变量里,这个接口的实现这里把它称为存储处理器,有了它我们就可以在里面实现数据库存储逻辑等等了。

下面来看一看Symfony的Session组件是怎么运作的,先看一张图:

整个Session系统向用户提供一个统一的界面,由 SessionInterface接口定义,在内部分为两大部分:

SessionBagInterface:数据包接口,用于管理最终用户的数据,这里称之为数据包管理器

SessionStorageInterface:储存处理接口,用于处理数据的储存、Session ID分配等,这里称为储存管理器

数据管理器默认提供了三大类:

AttributeBag:属性包,通常使用的数据就存放在这里

FlashBag:闪存包,应对一些特殊用途,数据只能被取出一次,用后即毁

MetadataBag:元数据包,用于存储Session数据本身的一些元数据,比如Session创建的时间、最后使用时间、生命周期

在SessionBagInterface接口里面我们可以看到两个属性:Name和StorageKey,Name好理解,它用于标识这个数据包,但StorageKey是什么意思?其实数据包里面的数据都是储存在$_SESSION里面,数据包管理器本身只是储存一个引用而已,真正的数据在$_SESSION[$StorageKey]里。每个包都对应着$_SESSION的一个子数组,这样就实现了Session也可以和其他第三方软件兼容,包是如何和$_SESSION[$StorageKey]关联的呢?这就是接口里面initialize(array &$array)方法的工作。

下面看一看储存管理器:

Symfony默认实现了一个储存管理器:NativeSessionStorage,它封装了php的原生Session使用,使用php原生的储存处理器SessionHandlerInterface

我们在示例化Session的时候可以传入自定义的储存管理器及包管理器,构造函数如下:

__construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)

在不提供任何参数时直接使用php原生机制,不同的是它已经被包装成了面向对象方式

use Symfony\Component\HttpFoundation\Session\Storage\Session\Session;

$Session=new Session();
$Session->set($name, $value);

以上就是Symfony的Session组件原理。

drupal有所改进,包括储存Session到数据库,详见\core\lib\Drupal\Core\Session

它涉及到用户账户接口,另外再讨论

作者声明:
伴随Drupal不断发布的新版本,本系列教程持续更新,适用于Drupal V8、V9、V10以及后续版本,如未及时更新请反馈。
本Drupal教程为中文原创,并非翻译,来自作者耗时八年对源代码的理解,最初取名为“云客Drupal源码分析”并在社区发布。
作者:云客,微信号及个人网站域名均为“indrupal”;首发于云客个人网站“水滴间”,已发布一百余万字,持续更新中。
鸣谢“未来很美科技”提供的赞助支持,“未来很美(深圳)科技有限公司”是国内专业的Drupal开发公司,总部位于深圳。
如对您有帮助可到“水滴间”进行赞助支持,同时Drupal中国社区需要大家共建共享,云客持开放态度与大家合作推进。
允许任何机构以及个人转载、翻译、引用传播等,但须同步附带本声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业微信接口测试实战(一)

本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 霍格沃茨启发: 测试开发进阶班>接口自动化测试>企业微信接口测试实战 企业微信接口测试实战 一、准备环境二、脚本实现2.1、 获得access_token2…

防火墙用户管理理论+实验

目录 注:实验需要有安全策略配置、NAT配置基础 一、防火墙用户管理重要知识点 用户管理 访问控制策略 NGFW下一代防火墙 AAA 鉴别方式——认证 用户认证的分类: 上网用户上线流程: 二、用户认证实验: 实验拓扑 先配置防…

pmp考试是什么?

PMP是一个全球资格认证,也是目前项目管理领域大家公认的证书,相当于项目管理的入门证书。 一、PMP 是什么 pmp 中文叫项目管理专业人士资格认证,目前项目管理领域大家公认的证书,是一个用来评估项目管理人员的知识技能是否已经达…

D. Divide and Summarize(BFS+二分+预处理)

Problem - 1461D - Codeforces 迈克收到一个长度为n的数组作为生日礼物,决定测试一下它的漂亮程度。 如果有一种方法可以通过一定数量(可能是零)的切片操作得到一个元素总和为si的数组,那么这个数组将通过第i次漂亮度测试。 一个…

红红火火的VB,悄然离去,新型中文编程,如日中天

“悲哀!现在用VB连1200都赚不到。”一位VB程序员有感而发。曾经红红火火的VB编程语言,如今却徘徊在被淘汰边缘,让人惋惜。 依稀记得,读大学时候,有一位财务专业同学,特别喜欢计算机,有空就自学V…

密码学引论 | DES

文章目录DES算法1 算法流程2 算法细节(1)子密钥的产生(2)初始置换IPIPIP(3)加密函数(4)逆初始置换IP−1IP^{-1}IP−1例题DES算法 1 算法流程 64位密钥经子密钥产生算法产生出16个子…

用 TypeScript 类型运算实现一个五子棋游戏

之前有看到有大佬用类型运算实现了中国象棋程序 和 Lisp 解释器 甚是震惊,之前不太会看不懂。 最近也学了点类型体操的内容想着自己也玩一下。选择五子棋的原因是相对来说规则是更简单一些的也比较好实现。此实现没有考虑性能上优化和最佳实现方式只关注功能的实现…

详细步骤讲解matlab代码通过Coder编译为c++并用vs2019调用

项目上需要C,奈何本人不会,所以就用matlab写好测试后,用matlab Coder编译为c并用vs2019调用 一个简单的例子,求取两个4*4矩阵相加后,在求取最大值与最小值。matlab代码如下 function [a,b] min_max(m,n)temp mn;a m…

STM32F407 电机编码器测量

文章目录一、STM32F407 定时器编码器功能1.1 STM32定时器简介1.2 STM32定时器编码器功能二、带编码器的直流电机三、代码与验证3.1 初始化代码3.2 验证一、STM32F407 定时器编码器功能 1.1 STM32定时器简介 STM32的定时器功能非常强大,根据官方手册,定…

旅游网页设计 web前端大作业 全球旅游私人订制 旅游公司网站模板(HTML+CSS+JavaScript)

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

OctaneRender界面布局自定义界面教程丨使用教程

您可以通过单击并拖动每个窗格左上角的方块(图 1)来重新排列 OctaneRender 界面(图形编辑器、渲染视口、节点检查器和大纲视图)中每个窗格的窗口。 图 1:窗格排列图标 用任何鼠标按钮单击同一个方块会显示更多用于…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.20 ActiveMQ 安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.20 ActiveMQ 安装5.20.1 下载5.20.2 安装5.20.3 使…

[附源码]SSM计算机毕业设计基于的城镇住房公积金管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Unity Hair 毛发系统 初体验

文章目录🎈 简介🎈 所需环境🎈 下载安装🎈 使用初体验🍭 创建一个Hair示例🍭 Hair Asset🍭 尝试给Avatar创建头发🍭 如何更改材质🎈 简介 8月份的时候Unity官方发布了Ha…

第7章 Elasticsearch面试题

7 . 1 为什么要使用Elasticsearch? 系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描&am…

即将见面:SpreadJS V16:重大改进

内容摘自互联网::::::: 新功能背景:在SpreadJS V16之前,关于文件toJSON()之后,生成的json文件太大,一直被很多客户诟病。例如,同样一…

PySide创建界面关联项目(五) 百篇文章学PyQT

本文章是百篇文章学PyQT的第五篇,本文讲述如何使用PySide创建UI界面,并且关联入PyCharm 新建的项目中成功运行第一个PyQT程序,博主在本篇文章中将遇到和踩过的坑总结出来,可以供大家参考,希望大家安装顺利。包括 安装、…

我的Vue组件化开发首个项目todolist

TodoList 学习笔记: 总结TodoList案例 1.组件化编码流程: (1).拆分静态组件:组件要按照功能点拆分,命名不要与htm|元素冲突。 (2).实现动态组件:考虑好数据的存放位置,数据是一个组件在用, 还是一些组件在用: . 1).-个组件在…

Vue简单实例——从webpack到vue,再到weex

这一章节,我们主要针对从webpack,vue,weex的框架结构上来说明对比这三个框架的区别 主要功能: webpack: webpack是前端项目工程化的具体解决方案。 它提供了友好的前端模块化开发支持,以及代码压缩混淆&…

基于身份的分段:三种技术路线解析与建议

SmartX 趋势分享 SmartX 趋势分享由 SmartX 团队内部分享的权威机构市场报告、全球重要媒体文章精选整理而成。内容涉及现代数据中心相关产业趋势以及金融、医疗、制造等行业全球用户需求与实践前沿洞察。在“零信任实践”系列的第一篇文章中,我们介绍了两种实现零信…