Koa2學習(八)使用session
阿新 • • 發佈:2018-11-17
Koa2學習(八)使用session
koa2框架不提供session的處理方法,這裡我們需要藉助一個第三方中介軟體koa-session
來處理session。
先安裝外掛:
$ npm i koa-session
通過註冊這個中介軟體,我們可以直接通過ctx.session
來操作session:
const Koa = require('koa') const app = new Koa() const session = require('koa-session') app.keys = ['secret'] // session加密欄位 app.use(session({ key: 'koa:sess', //cookie key (default is koa:sess) maxAge: 86400000, // cookie的過期時間 maxAge in ms (default is 1 days) overwrite: true, //是否可以overwrite (預設default true) httpOnly: true, //cookie是否只有伺服器端可以訪問 httpOnly or not (default true) signed: true, //簽名預設true rolling: false, //在每次請求時強行設定cookie,這將重置cookie過期時間(預設:false) renew: false, //(boolean) renew session when session is nearly expired, }, app)) app.use(ctx => { // ignore favicon if (ctx.path === '/favicon.ico') return console.log(ctx.session) let n = ctx.session.views || 0 ctx.session.views = ++n ctx.body = n + ' views' }); app.listen(8000) module.exports = app
- 這個ctx.session是針對某一個瀏覽器使用者的。
- 不斷地重新整理訪問瀏覽器,瀏覽器上顯示的訪問次數會增加。
- 如果不使用資料庫,session是儲存在記憶體中的。在服務端通常會使用redis等方案來使session持久化。
現在我們來模擬一個簡單的登陸:
const Koa = require('koa') const app = new Koa() const session = require('koa-session') app.keys = ['secret'] // session加密欄位 app.use(session({}, app)) app.use(async (ctx, next) => { if (ctx.url === '/login') { ctx.session.user_name = 'zhangsan' ctx.body = { msg: '登入成功' } } await next() }) app.use(async (ctx, next) => { if (ctx.url === '/logout') { ctx.session = null ctx.body = { msg: '退出成功' } } await next() }) app.use(async ctx => { console.log(ctx.session) if (ctx.url === '/index') { if (ctx.session.user_name === 'zhangsan') { ctx.body = { msg: '成功匹配到使用者zhangsan' } } else { ctx.body = { msg: '登陸驗證失敗' } } } }) app.listen(8000) module.exports = app
- 當用戶登陸到login頁面時,session會將zhangsan儲存為user_name。
- 使用者訪問index頁面時,session會對當前的user_name做匹配,如果匹配成功,則認證登陸成功。
- 使用者訪問logout頁面是,session會自我銷燬。
- 這樣再次訪問index頁面時,登陸就會失敗。