koa2學習筆記(六)學會使用session

Session原理

Session的原理其實仍是依賴了Cookie,因此Cookie纔是記錄用戶憑證的真理。它的原理大概是醬紫的:服務器端維護一個session的表,這個表的每一條記錄存的就是與某一個客戶端的會話,會話會有過時時間,過時的會話會被清理。而後這個會話,會有一個對應的id,通常是一串長長的看不懂的字符串,而後這個字符串會被存儲在客戶端的cookie中,每一次請求服務器端都會帶上這個cookie,服務器端就知道訪問的就是哪一個客戶端了。前端

使用koa-session

koa2框架不提供session的處理方法,這裏咱們須要藉助一個第三方中間件koa-session來處理session。git

app.jsgithub

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)

複製代碼
  • 這個ctx.session是針對某一個瀏覽器用戶的。redis

  • 不斷地刷新訪問瀏覽器,瀏覽器上顯示的訪問次數會增長。數據庫

  • 若是不使用數據庫,session是保存在內存中的。在服務端一般會使用redis等方案來使session持久化。瀏覽器

如今咱們來模擬一個簡單的登錄:bash

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)
複製代碼

一個最簡單的session登陸就實現了。下面是我寫的一個登陸註冊demo登陸註冊服務器

github地址是github.com/qz9527/koa2,若是以爲有用的話,歡迎star。cookie

小強前端交流羣QQ羣:724179055session

定時分析技術和資料,歡迎你們進來一塊兒交流。

往期回顧地址:

相關文章
相關標籤/搜索