当前位置: 首页 > news >正文

storageless完整API速查:Configuration与SessionInterface核心方法详解

storageless完整API速查:Configuration与SessionInterface核心方法详解

【免费下载链接】storageless:mailbox_with_mail: storage-less PSR-7 session support项目地址: https://gitcode.com/gh_mirrors/st/storageless

storageless 是一个基于 PSR-7 的无存储会话(storage-less session)PHP 库,它把会话数据直接签名进 JWT 并保存在 Cookie 里,彻底告别服务端 Session 存储。本文是一份面向新手的 storageless 完整 API 速查,重点详解Configuration配置类与SessionInterface会话接口的核心方法,帮你快速上手这套无存储会话方案。

📌 storageless 是什么?无存储会话原理速览

传统 PHP 会话依赖$_SESSION与服务端存储,而 storageless 的做法完全不同:

  • 会话数据被序列化后写入 JWT Token,再放入 Cookie(默认名为__Secure-slsession
  • JWT 使用对称或非对称密钥签名,客户端无法篡改数据
  • 服务端无需任何存储、无需粘性会话,任意节点持有密钥即可校验会话

这带来两个显著优势:零 I/O(不再读写 Session 文件或数据库)和天然支持水平扩展。官方建议会话数据控制在 400 字节以内,且内容应允许客户端可读(因为 JWT 默认只签名、不加密)。

核心源码参考:src/Storageless/Session/、src/Storageless/Http/SessionMiddleware.php

⚙️ storageless Configuration 核心方法详解

PSR7Sessions\Storageless\Http\Configuration是 storageless 的配置中心,位于 src/Storageless/Http/Configuration.php。它采用不可变设计:所有with*方法都会返回新的实例,不会修改原对象。

构造入口:fromJwtConfiguration()

这是最常用的工厂方法,只需传入lcobucci/jwt的配置即可:

use Lcobucci\JWT\Configuration as JwtConfig; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\Signer\Key\InMemory; use PSR7Sessions\Storageless\Http\Configuration; use PSR7Sessions\Storageless\Http\SessionMiddleware; $sessionMiddleware = new SessionMiddleware( Configuration::fromJwtConfiguration( JwtConfig::forSymmetricSigner( new Sha256(), InMemory::base64Encoded('替换成你自己的高熵密钥'), ) ) );

读取方法速查表(Getter)

方法返回值说明
getJwtConfiguration()JwtConfig获取 JWT 签名/校验配置
getClock()ClockInterface获取时钟(默认系统时间)
getCookie()SetCookie获取会话 Cookie 配置
getIdleTimeout()int会话空闲超时(秒),默认43200(12 小时)
getRefreshTime()intToken 刷新间隔(秒),默认60
getSessionAttribute()string会话挂载到 Request 的属性名,默认session
getClientFingerprintConfiguration()FingerprintConfig客户端指纹(防会话劫持)配置

修改方法速查表(With 系列)

方法用途
withJwtConfiguration(JwtConfig $c)更换签名算法或密钥
withClock(ClockInterface $c)注入自定义时钟(测试常用)
withCookie(SetCookie $c)自定义 Cookie 名称、Secure、HttpOnly 等
withIdleTimeout(int $sec)调整会话空闲过期时间
withRefreshTime(int $sec)调整 Token 自动续期间隔
withSessionAttribute(string $name)修改 Request 中的会话属性名
withClientFingerprintConfiguration(FingerprintConfig $f)开启 IP + User-Agent 指纹校验

默认值速览 🎯

  • Cookie 名:__Secure-slsessionSecure+HttpOnly+SameSite=Lax
  • 空闲超时:43200 秒(12 小时)
  • Token 刷新:每 60 秒
  • 本地开发时请用withCookie()关闭 Secure 标记,详见 docs/configuration.md

🔑 storageless SessionInterface 核心方法详解

SessionInterface是所有会话对象的统一接口,位于 src/Storageless/Session/SessionInterface.php。它继承自JsonSerializable,方法非常精简。

八个核心方法一览

interface SessionInterface extends JsonSerializable { public function set(string $key, $value): void; // 写入数据 public function get(string $key, $default = null); // 读取数据 public function remove(string $key): void; // 删除单个键 public function clear(): void; // 清空会话 public function has(string $key): bool; // 键是否存在 public function hasChanged(): bool; // 会话是否被修改过 public function isEmpty(): bool; // 会话是否为空 public function jsonSerialize(): object; // 序列化为对象 }

使用技巧 📝

  • get()的默认值:键不存在时返回$default(会被转换成可安全存储的标量或数组)
  • hasChanged()很关键:中间件靠它判断是否需要重新签发 Cookie。若会话被清空(isEmpty()为 true),会直接下发过期 Cookie 实现注销
  • set()的值类型:支持标量、数组、对象或JsonSerializable,内部通过 JSON 编码统一转换成标量与数组

两个重要实现类

  • DefaultSessionData:默认实现,通过newEmptySession()fromDecodedTokenData()等静态方法创建,见 src/Storageless/Session/DefaultSessionData.php
  • LazySession:惰性加载包装器,只有真正访问会话时才解析 JWT,提升性能,见 src/Storageless/Session/LazySession.php

🚀 实战:10 秒接入 PSR-7 中间件

在任意 PSR-15 兼容应用中,通过SessionMiddleware即可获得会话能力:

use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; $app->get('/counter', function (ServerRequestInterface $request, ResponseInterface $response) { $session = $request->getAttribute(SessionMiddleware::SESSION_ATTRIBUTE); $count = $session->get('counter', 0) + 1; $session->set('counter', $count); $response->getBody()->write('访问次数:' . $count); return $response; });

要点:通过SessionMiddleware::SESSION_ATTRIBUTE(即session)从 Request 属性中取出会话对象,读写即可,中间件会自动完成 JWT 签发、校验与续期。完整可运行示例见 examples/index.php。

🛡️ 安全增强:客户端指纹绑定

为防止 Cookie 被盗导致的会话劫持,可绑定客户端 IP 与 User-Agent:

use PSR7Sessions\Storageless\Http\ClientFingerprint\Configuration as FingerprintConfig; $config = Configuration::fromJwtConfiguration(/* ... */) ->withClientFingerprintConfiguration( FingerprintConfig::forIpAndUserAgent() );

反向代理场景下可自定义Source接口实现,提取X-Real-IP等头部,参考 src/Storageless/Http/ClientFingerprint/。

💡 常见问题与注意事项

  • 会话数据会暴露给客户端:JWT 只签名不加密,请勿存放敏感信息
  • Cookie 体积限制:建议会话小于 400 字节,避免超出浏览器 Cookie 上限
  • 本地开发:默认 Cookie 带__Secure-前缀且要求 HTTPS,本地调试需用withCookie()调整
  • 局限性清单:更多边界情况可查阅 docs/limitations.md

✅ 总结

storageless 用一套非常精简的 API 就实现了完整的无存储会话能力:Configuration负责全部配置(签名、Cookie、超时、指纹),SessionInterface提供八个直观的读写方法,配合SessionMiddleware即可无缝融入 PSR-7/PSR-15 应用。希望这份 storageless 完整 API 速查能成为你日常开发中的随身手册 🗂️

【免费下载链接】storageless:mailbox_with_mail: storage-less PSR-7 session support项目地址: https://gitcode.com/gh_mirrors/st/storageless

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4123546.html

相关文章:

  • 雨雾、夜间复杂工况下机旅客实时三维定位与轨迹生成,筑牢机场边检管控第一环
  • JDK-21虚拟线程使用
  • Cortex-M3-STM32F1 开发:(四十六)ADC 实例 4 :单通道 ADC 过采样实例,使用 DMA,两种编程方式
  • 收藏夹里500个“稍后再看“吃灰?这款免费AI视频总结工具帮你3分钟榨干B站课程
  • gruf 健康检查集成:接入官方 gRPC 健康检查协议,让 Ruby 微服务秒过探针
  • S-mall-ssm 订单状态机设计:5种状态如何驱动电商订单的完整生命周期?
  • 你的macOS菜单栏为什么总是乱成一团?这个叫Ice的菜单栏管理工具给出了答案
  • 老Mac免费吃上macOS Sequoia:OpenCore Legacy Patcher从零到上手完整指南
  • 磁盘空间告急怎么办?免费开源Czkawka的14个清理工具,帮你找出重复文件、相似图片和空文件夹
  • 深入源码:THCalendarDatePicker 日历网格布局算法是如何工作的?
  • 老款Mac焕新三步走:用OpenCore Legacy Patcher免费升级最新macOS完整指南
  • DesktopAssistant打包发布实战:生成Windows安装程序与deb包的完整步骤
  • ZCode与DeepSeek集成指南:打造本地AI编程助手
  • Dtims CPB4612-LF 控制板
  • 对比评测:GifHub vs 其他 GitHub GIF 插件,谁才是评论区动图之王?
  • TypeScript-New-Handbook 新手教程:10 分钟理解静态类型检查的核心理念
  • TypeScript-New-Handbook 完全指南:微软官方 TypeScript 新手册,一篇读懂全貌
  • 磁盘清理工具免费推荐:开源 Czkawka,把重复文件与相似图片一次清干净
  • THCalendarDatePicker 手势交互揭秘:滑动切换月份与年份的 5 个实现细节
  • 基于SpringBoot+Vue的个性化音乐平台网站(源码+讲解视频+LW)
  • obs-shaderfilter扩展像素功能解析:轻松实现投影与边框的渲染技巧
  • 【软考信息安全】密码学考点“涮“明白!5张美食思维导图带你一锅端
  • 给 Copilot for Xcode 开发自定义工具:3 个实战案例,把 AI 助手调教成真正会干活的搭档
  • ECC 智能体钩子系统架构解析:如何为 AI 编码 Agent 装上“会记忆、能拦截、可审计“的行为护栏
  • 洛雪音乐音源怎么装最省心?免费无损音源合集实测导入指南
  • 免费通用设计字体 Morisawa BIZ UDGothic 上手教程:三步搞定下载、安装与排版
  • FIFA 23 修改器完整免费指南:从首条脚本到高阶模组,快速掌控生涯模式全细节
  • 微信聊天记录终极备份指南:用WeChatMsg免费导出HTML、Word、CSV与年度报告
  • ZoneMTA 智能退信处理:如何识别灰名单、拒收与 IP 拉黑
  • 小芯片运行模型时的资源边界