[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)。
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware