Session
最后更新于:2022-04-01 04:34:08
[TOC=2,3]
需要用户登录的网站基本上都离不开 Session,ThinkJS 里默认支持多种类型的 Session,如:`file`,`db`,`redis` 等。
## 支持的 Session 类型
* `base` 内存方式
* `file` 文件类型
* `db` 数据库类型
* `redis` Redis 类型
#### db Session
使用 `db` 类型的 Session 需要创建对应的数据表,可以用下面的 SQL 语句创建:
~~~
DROP TABLE IF EXISTS `think_session`;
CREATE TABLE `think_session` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cookie` varchar(255) NOT NULL DEFAULT "",
`data` text,
`expire` bigint(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `cookie` (`cookie`),
KEY `expire` (`expire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
~~~
需要将 `think_` 改为 db 配置中的数据表前缀。
#### redis Session
使用 `redis` 类型的 Session 需要配置 Redis,具体见 [配置](https://thinkjs.org/zh-CN/doc/2.0/config.html#redis)。
## Session 配置
Session 默认配置如下,可以在 `src/common/config/session.js` 中进行修改:
~~~
export default {
type: "file",
name: "thinkjs", //对应 cookie 的名称
path: runtimePrefix + "/session", // file 类型下缓存文件的目录
secret: "", //Session 对应的 cookie 是否需要加密
timeout: 24 * 3600, //过期时间,默认为一天
cookie: { //Session 对应的 cookie 配置项
length: 32
}
};
~~~
关于 Cookie 的配置请见 [配置](https://thinkjs.org/zh-CN/doc/2.0/config.html#cookie)。
## Session 读写
Controller 或 Logic 里可以通过下面的方式读写 Session:
#### 读取 Session
~~~
export default class extends think.controller.base {
* indexAction(){
//获取session
let value = yield this.session("userInfo");
}
}
~~~
#### 设置 Session
~~~
export default class extends think.controller.base {
* indexAction(){
//设置 session
yield this.session("userInfo", data);
}
}
~~~
#### 清除 Session
~~~
export default class extends think.controller.base {
* indexAction(){
//清除当前用户的 session
yield this.session();
}
}
~~~
* * *
http 对象上可以通过 `http.session` 方法读写 Session,具体请见 [API -> http](https://thinkjs.org/zh-CN/doc/2.0/api_http.html#httpsessionname-value)。
## 扩展 Session
可以通过下面的命令创建 Session Adapter:
~~~
thinkjs adapter session/foo
~~~
会创建文件 `src/common/adapter/session/foo.js`,需要实现下面的方法:
~~~
export default class extends think.adapter.session {
/**
* init
* @param {Object} options []
* @return {} []
*/
init(options){
}
/**
* 获取 Session
* @param {String} name []
* @return {Promise} []
*/
get(name){
}
/**
* 设置 Session
* @param {String} name []
* @param {Mixed} value []
*/
set(name, value){
}
/**
* 删除 Session
* @param {String} name []
* @return {Promise} []
*/
delete(name){
}
/**
* 更新 Session
* @return {Promise} []
*/
flush(){
}
/**
* 清除过期的 Session
* @return {Promise} []
*/
gc(){
}
}
~~~
框架里的 Session 实现请见 [https://github.com/75team/thinkjs/tree/master/src/adapter/session](https://github.com/75team/thinkjs/tree/master/src/adapter/session)。
## 使用第三方 Session Adapter
如何使用第三方的缓存 Adapter 请参见 [Adapter -> 介绍](https://thinkjs.org/zh-CN/doc/2.0/adapter_intro.html#使用第三方-adapter)。