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。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM