koa2 從入門到進階之路 (七)
之前的文章我們介紹了一下 koa koa-static靜態資源中介軟體,本篇文章我們來看一下 koa 中 cookie 和 session 的使用。
cookie 是儲存於訪問者的計算機中的變數。可以讓我們用同一個瀏覽器訪問同一個域名的時候共享資料。
HTTP 是無狀態協議。簡單地說,當你瀏覽了一個頁面,然後轉到同一個網站的另一個頁 面,伺服器無法認識到這是同一個瀏覽器在訪問同一個網站。每一次的訪問,都是沒有任何關係的。
我們將之前專案中的 app.js 改為如下程式碼:
1 //引入 koa模組 2 const Koa = require('koa'); 3 const Router = require('koa-router'); 4 const views = require('koa-views'); 5 const static = require('koa-static'); 6 7 //例項化 8 const app = new Koa(); 9 const router = new Router(); 10 11 //配置靜態資源中介軟體 12 app.use(static(__dirname + "/static")); 13 14 //配置模板引擎中介軟體 15 app.use(views('views', { 16 extension: 'ejs' 17 })); 18 19 router.get('/', async (ctx) => { 20 // 設定 cookie 21 ctx.cookies.set('userinfo',encodeURIComponent('張三'),{maxAge:10*1000}) 22 await ctx.render('index', {}); 23 }); 24 25 router.get('/news', async (ctx) => { 26 // 獲取 cookie 27 console.log(decodeURIComponent(ctx.cookies.get('userinfo'))); 28 await ctx.render('index', {}); 29 }); 30 31 //啟動路由 32 app.use(router.routes()); 33 app.use(router.allowedMethods()); 34 35 app.listen(3000);
我們在 router.get("/" ) 中通過 ctx.cookie.set() 的形式設定了一個 "userifon" 的 cookie ,然後在 router.get("/news" ) 中通過 ctx.cookie.get() 的形式來獲取我們設定的 userinfo 的 cookie 值。
當我們執行 localhost:3000 後再執行 localhost:3000/news 時,我們在程式碼編輯器控制檯可以看到如下輸出結果:
從上圖可以看出我們已經獲取到了 userinfo = "張三" 的 cookie 值。
在 ctx.cookie.set() 中第三個引數為一個物件,裡面有一些可選引數,如上面我們設定了一個 maxAge:10 * 1000;意思是該 cookie 值儲存時間為 10 * 1000 毫秒,即 10 秒鐘,在 10 秒之後會消失,還有其他可選引數,如下:
在上面的程式中,我們還用到了
encodeURIComponent 和 decodeURIComponent
上面的兩個名詞分別表示對引數編碼和解碼,我們在傳輸資料的時候如果是漢字,如 "張三",就需要對其編碼和解碼,這樣才能對內容做正確的傳輸。
接下來我們再看一下 koa 中 session 的使用。
session 是另一種記錄客戶狀態的機制,不同的是 Cookie 儲存在客戶端瀏覽器中,而 session 儲存在伺服器上。當瀏覽器訪問伺服器併發送第一次請求時,伺服器端會建立一個 session 物件,生 成一個類似於 key,value 的鍵值對, 然後將 key(cookie)返回到瀏覽器(客戶)端,瀏覽 器下次再訪問時,攜帶 key(cookie),找到對應的 session(value)。 客戶的資訊都儲存 在 session 中。
使用 koa 中的 session,我們需要安裝 koa-session 的模組
npm install koa-session --save
我們將上面的 app.js 改為如下:
1 //引入 koa模組 2 const Koa = require('koa'); 3 const Router = require('koa-router'); 4 const views = require('koa-views'); 5 const static = require('koa-static'); 6 const session = require('koa-session'); 7 8 //例項化 9 const app = new Koa(); 10 const router = new Router(); 11 12 //配置靜態資源中介軟體 13 app.use(static(__dirname + "/static")); 14 15 //配置模板引擎中介軟體 16 app.use(views('views', { 17 extension: 'ejs' 18 })); 19 20 //配置session的中介軟體 21 app.keys = ['some secret hurr']; /**cookie的簽名 預設*/ 22 const CONFIG = { 23 key: 'koa:sess', /** 預設 */ 24 maxAge: 10000, /** cookie的過期時間 */ 25 overwrite: true, /** 預設 可以重寫過期時間 */ 26 httpOnly: true, /** true表示只有伺服器端可以獲取 cookie */ 27 signed: true, /** 預設 簽名 */ 28 rolling: true, /** 在每次請求時強行設定 cookie,這將重置 cookie 過期時間(預設:false) */ 29 renew: false, /** 當用戶進行瀏覽器操作時重新整理 cookie 過期時間 */ 30 }; 31 app.use(session(CONFIG, app)); 32 33 router.get('/', async (ctx) => { 34 // 設定 cookie 35 ctx.session.userinfo='張三'; 36 await ctx.render('index', {}); 37 }); 38 39 router.get('/news', async (ctx) => { 40 // 獲取 cookie 41 console.log(ctx.session.userinfo); 42 await ctx.render('index', {}); 43 }); 44 45 //啟動路由 46 app.use(router.routes()); 47 app.use(router.allowedMethods()); 48 49 app.listen(3000);
如上,我們需要在最開頭引入我們的 koa-session 模組,然後設定 session 中介軟體。session 中也有類似於 cookie 的可選值,其中我們只需要修改 maxAge,rolling 和 renew 三個值即可。
maxAge:過期時間,以毫秒為單位。
rolling:當我們每次有瀏覽器請求時會重新重新整理我們的 session 過期時間,是一個具體的時間值,如 12:00:00。
renew:當我們每次有瀏覽器請求時會重新重新整理我們的 session 過期時間,是一個時間範圍,如 5000 毫秒。
接下來我們就可以在我們的瀏覽器中使用 session 了,我們在進入 localhost:3000 時設定一個 userinfo="張三",當進入 localhost:3000/news 時在程式碼編輯器後臺列印輸出這個 userinfo,如下:
我們拿到了 userinfo:"張三" 的值。
現在我們來看一下 cookie 和 session 的區別:
1、cookie 資料存放在客戶的瀏覽器上,session 資料放在伺服器上。
2、cookie 不是很安全,別人可以分析存放在本地的 cookie 並進行 cookie 欺騙,考慮到安全應當使用 session。
3、session 會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能 考慮到減輕伺服器效能方面,應當使用 cookie。
4、單個 cookie 儲存的資料不能超過 4K,很多瀏覽器都限制一個站點最多儲存 20 個 cookie。
&n