koa學習之路七

以前的文章咱們介紹了一下 koa koa-static靜態資源中間件,本篇文章咱們來看一下 koa 中 cookie 和 session 的使用。html

cookie 是存儲於訪問者的計算機中的變量。可讓咱們用同一個瀏覽器訪問同一個域名的時候共享數據。npm

HTTP 是無狀態協議。簡單地說,當你瀏覽了一個頁面,而後轉到同一個網站的另外一個頁 面,服務器沒法認識到這是同一個瀏覽器在訪問同一個網站。每一次的訪問,都是沒有任何關係的。瀏覽器

咱們將以前項目中的 app.js 改成以下代碼:安全

//引入 koa模塊
const Koa = require('koa');
const Router = require('koa-router');
const views = require('koa-views');
const static = require('koa-static');

//實例化
const app = new Koa();
const router = new Router();

//配置靜態資源中間件
app.use(static(__dirname + "/static"));

//配置模板引擎中間件
app.use(views('views', {
    extension: 'ejs'
}));

router.get('/', async (ctx) => {
    // 設置 cookie
    ctx.cookies.set('userinfo',encodeURIComponent('張三'),{maxAge:10*1000})
    await ctx.render('index', {});
});

router.get('/news', async (ctx) => {
    // 獲取 cookie
    console.log(decodeURIComponent(ctx.cookies.get('userinfo')));
    await ctx.render('index', {});
});

//啓動路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

咱們在 router.get("/" ) 中經過 ctx.cookie.set() 的形式設置了一個 "userifon" 的 cookie ,而後在 router.get("/news" ) 中經過 ctx.cookie.get() 的形式來獲取咱們設置的 userinfo 的 cookie 值。服務器

當咱們運行 localhost:3000 後再運行 localhost:3000/news 時,咱們在代碼編輯器控制檯能夠看到以下輸出結果:cookie

從上圖能夠看出咱們已經獲取到了 userinfo = "張三" 的 cookie 值。session

在 ctx.cookie.set() 中第三個參數爲一個對象,裏面有一些可選參數,如上面咱們設置了一個 maxAge:10 * 1000;意思是該 cookie 值存儲時間爲 10 * 1000 毫秒,即 10 秒鐘,在 10 秒以後會消失,還有其餘可選參數,以下:併發

在上面的程序中,咱們還用到了app

encodeURIComponent 和 decodeURIComponent 

上面的兩個名詞分別表示對參數編碼和解碼,咱們在傳輸數據的時候若是是漢字,如 "張三",就須要對其編碼和解碼,這樣才能對內容作正確的傳輸。koa

 

接下來咱們再看一下 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 改成以下:

//引入 koa模塊
const Koa = require('koa');
const Router = require('koa-router');
const views = require('koa-views');
const static = require('koa-static');
const session = require('koa-session');

//實例化
const app = new Koa();
const router = new Router();

//配置靜態資源中間件
app.use(static(__dirname + "/static"));

//配置模板引擎中間件
app.use(views('views', {
    extension: 'ejs'
}));

//配置session的中間件
app.keys = ['some secret hurr'];   /**cookie的簽名 默認*/
const CONFIG = {
    key: 'koa:sess', /** 默認 */
    maxAge: 10000,  /**  cookie的過時時間 */
    overwrite: true, /** 默認 能夠重寫過時時間 */
    httpOnly: true, /**  true表示只有服務器端能夠獲取 cookie */
    signed: true, /** 默認 簽名 */
    rolling: true, /** 在每次請求時強行設置 cookie,這將重置 cookie 過時時間(默認:false) */
    renew: false, /** 當用戶進行瀏覽器操做時刷新 cookie 過時時間 */
};
app.use(session(CONFIG, app));

router.get('/', async (ctx) => {
    // 設置 cookie
    ctx.session.userinfo='張三';
    await ctx.render('index', {});
});

router.get('/news', async (ctx) => {
    // 獲取 cookie
    console.log(ctx.session.userinfo);
    await ctx.render('index', {});
});

//啓動路由
app.use(router.routes());
app.use(router.allowedMethods());

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 的區別:

  一、cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上。 

  二、cookie 不是很安全,別人能夠分析存放在本地的 cookie 並進行 cookie 欺騙,考慮到安全應當使用 session。 

  三、session 會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能 考慮到減輕服務器性能方面,應當使用 cookie。 

  四、單個 cookie 保存的數據不能超過 4K,不少瀏覽器都限制一個站點最多保存 20 個 cookie。 

 

 

 

內容來自:http://www.javashuo.com/article/p-tadvkfpo-cp.html

相關文章
相關標籤/搜索