🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# session插件 由 session_start 在 swoole下无法使用,该插件则提供了与php-fpm下一样功能的session。 ## 插件安装 ESD默认已经启用了session插件,无需安装。 ## Session初始化 ### 方法1 在继承 goController 的对象内直接使用 $this->session 获取session对象。 ### 方法2 在其他对象内添加 `trait` ~~~ use GetSession; ~~~ 然后直接使用 $this->getSession() 获取session 对象。 ### 方法3 对类中的属性添加注解,进行对象注入。 ~~~ use DI\Annotation\Inject; use ESD\Plugins\Session\GetSession; /** * @Inject() * @var HttpSession */ protected $session; ~~~ ## session方法 在下面的例子中,将以方法1作为演示。 >[danger]创建 session,类似session_start,但是注意,每调用一次均会创建一次 session_id ~~~ $this->session->create(); ~~~ ## 查看 session _id ~~~ $this->session->getId(); ~~~ ## session 是否存在且未过期 ~~~ $this->session->isAvailable(); ~~~ ## session 是否存在 ~~~ $this->session->isExist(); ~~~ ## session 是否新创建 ~~~ $this->session->isNew(); ~~~ ## 设置 session key value ~~~ $this->session->setAttribute(); ~~~ ## 移除 session key value ~~~ $this->session->removeAttribute(); ~~~ ## 获取 session ~~~ $this->session->getAttribute(); ~~~ ## 刷新 session >[info]当使用 token 方式时,可能需要在 token 过期前进行续期,该方法会重新生成新的 session_id ,如果使用cookie 会生成新的cookie,如果使用token 会在header中返回新的session_id ,客户端收到后应立即保存,因为旧的已经失效。 ~~~ $this->session->refresh(); ~~~ ## 消除 session ~~~ $this->session->destroy(); ~~~ ## 使用案例 ~~~ public function login() { $principal = new Principal(); $principal->addRole("user"); $principal->setUsername("user"); $this->setPrincipal($principal); if ($this->session->isAvailable()) { return "已登录" . $this->session->getId() . $this->session->getAttribute("test"); } else { $this->session->create(); $this->session->setAttribute("test", "hello"); return "登录" . $this->session->getId() . $this->session->getAttribute("test"); } } public function logout() { $this->session->destroy(); return "注销"; } ~~~ ## session 配置项 无需配置即可直接使用,如果需要覆盖默认配置,需要将被覆盖的部分参数增加到 `application.yml`文件中。下面依次说明相关配置, >[info]以下是session插件全部配置及默认值,如不修改默认值,可不必添加参数。 ~~~ session: timeout: 1800 (session过期时间,默认为30分钟) db: default (session使用的redis标识) session_storage_class: ESD\Plugins\Session\RedisSessionStorage::class (session驱动) session_name: "session" (session cookie 名称) session_usage: 'cookie' (session 维持方式 支持cookie,支持 token) domain: '' (cookie domain) path = '/'(cookie path) http_only: true (cookie 是否仅 httponly) secure: false (cookie 是否仅 ssl) ~~~ ## 覆盖默认配置 在 application.yml 增加配置信息,配置类中的驼峰参数,在配置文件中需要改为下划线和小写。配置中仅需要配置需要覆盖默认配置的选项即可。 ~~~ session: session_name: "mysession" ~~~ 配置说明 ## session_usage >[info] 默认使用cookie方式维持session_id 可选 token 方式,token 方式会在http header 中传递 Authorization 参数,由客户端保存 token 维持回话,适用于无状态的API请求。 ## session_storage_class >[info]默认使用 redis 作为 session 驱动,如果使用其他则需要实现 SessionStorage 接口内全部方法。