1. 程式人生 > >Koa2學習(八)使用session

Koa2學習(八)使用session

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
  1. 這個ctx.session是針對某一個瀏覽器使用者的。
  2. 不斷地重新整理訪問瀏覽器,瀏覽器上顯示的訪問次數會增加。
  3. 如果不使用資料庫,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
  1. 當用戶登陸到login頁面時,session會將zhangsan儲存為user_name。
  2. 使用者訪問index頁面時,session會對當前的user_name做匹配,如果匹配成功,則認證登陸成功。
  3. 使用者訪問logout頁面是,session會自我銷燬。
  4. 這樣再次訪問index頁面時,登陸就會失敗。