Egg.js_Cookie 與 Session

參考:Egg.js 文檔:Cookie 與 Session

HTTP 請(qǐng)求都是無(wú)狀態(tài)的窒百,但是我們的 Web 應(yīng)用通常都需要知道發(fā)起請(qǐng)求的人是誰(shuí)矗烛。為了解決這個(gè)問(wèn)題,HTTP 協(xié)議設(shè)計(jì)了一個(gè)特殊的請(qǐng)求頭:Cookie。服務(wù)端可以通過(guò)響應(yīng)頭(set-cookie)將少量數(shù)據(jù)響應(yīng)給客戶端咖气,瀏覽器會(huì)遵循協(xié)議將數(shù)據(jù)保存月而,并在下次請(qǐng)求同一個(gè)服務(wù)的時(shí)候帶上(瀏覽器也會(huì)遵循協(xié)議汗洒,只在訪問(wèn)符合 Cookie 指定規(guī)則的網(wǎng)站時(shí)帶上對(duì)應(yīng)的 Cookie 來(lái)保證安全性)。

Cookies

Cookies 的作用

  1. 同一個(gè)瀏覽器訪問(wèn)同一個(gè)域的時(shí)候父款,不同頁(yè)面之間的數(shù)據(jù)共享溢谤。
  2. 數(shù)據(jù)持久化瞻凤。(關(guān)閉瀏覽器后重新打開(kāi)瀏覽器頁(yè)面,數(shù)據(jù)還存在)世杀。

Egg.js 中 Cookie 的設(shè)置和獲取

Cookie 設(shè)置語(yǔ)法:ctx.cookies.set(key, value, options)

this.ctx.cookies.set('name','Andy');

Cookie 獲取語(yǔ)法:ctx.cookies.get(key, options)

this.ctx.cookies.get('name');

示例代碼

在響應(yīng)某一個(gè) HTML 頁(yè)面時(shí)阀参,設(shè)置 Cookies:

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {

  async index() {

    /*
     *  ??????
     *  設(shè)置 cookies
     *  ctx.cookies.set(key, value, options)
     *  參數(shù):
     *  key : cookies 的名稱
     *  value : cookies 的值
     *  optons : 配置
     */
    this.ctx.cookies.set('username', 'Andy', {
      maxAge: 1000 * 3600 * 24, // cookies 有效期:一天
      httpOnly: true,
      signed: true, // 對(duì) Cookies 進(jìn)行簽名,防止用戶修改
      encrypt: true, // 對(duì) Cookies 進(jìn)行加密瞻坝,同時(shí)獲取時(shí)ye需要解密
    });
    
    // 顯示表單頁(yè)面蛛壳,加載并渲染 HTML 模版文件
    // this.ctx.csrf 用戶訪問(wèn)頁(yè)面時(shí)生成的密鑰
    await this.ctx.render('home');
  }
}

module.exports = HomeController;

然后打開(kāi)其他頁(yè)面時(shí),可以獲取這個(gè)頁(yè)面中設(shè)置的 Cookies:

'use strict';

const Controller = require('egg').Controller;

class NewsController extends Controller {

  // 獲取數(shù)據(jù)顯示到新聞頁(yè)面
  async index() {

    // ?????? 獲取 cookies 值
    const userinfo = this.ctx.cookies.get('username', {
      encrypt: true, // 對(duì)被加密的 Cookies 進(jìn)行解密
    });
    console.log(userinfo);

    // 調(diào)用 Service 層方法
    const listInfo = await this.service.news.getNewsList();
    // 渲染模版引擎
    await this.ctx.render('news', { list: listInfo });
  }
}

module.exports = NewsController;

其他問(wèn)題

  1. 如何持久化存儲(chǔ) Cookies湿镀?
    默認(rèn)情況下炕吸,當(dāng)瀏覽器關(guān)閉后,Cookies 自動(dòng)銷毀勉痴『漳#可以設(shè)置 Cookies 的 optons 參數(shù)(maxAge 或者 expires,兩者選其一)設(shè)置 Cookies 有效期蒸矛。
  1. Cookies 如何設(shè)置中文瀑罗?
    默認(rèn)情況下,Egg.js 中的 Cookies 無(wú)法設(shè)置中文雏掠。但是斩祭,如果對(duì) Cookies 進(jìn)行加密操作,則可以設(shè)置中文 Cookies 了乡话。還有一種方式摧玫,也可以通過(guò)將 Buffer 轉(zhuǎn)換為 base64 進(jìn)行設(shè)置中文 Cookies。
  1. Cookies 如何設(shè)置對(duì)象绑青?
    對(duì)對(duì)象進(jìn)行序列化和反序列化操作即可設(shè)置對(duì)象:

    • JSON.stringify()
    • JSON.parse()
  2. 如何清除 Cookies诬像?
    將 Cookies 設(shè)置為空:this.ctx.cookies.set('name',null),或者設(shè)置 maxAge 過(guò)期時(shí)間為 0。

Session

Session 是另一種記錄客戶端狀態(tài)的機(jī)制闸婴,不同的是 Cookies 保存在客戶端瀏覽器中坏挠,而 Session 保存在服務(wù)器上。

Session 的工作流程

當(dāng)瀏覽器訪問(wèn)服務(wù)器并發(fā)送第一次請(qǐng)求時(shí)邪乍,服務(wù)器端會(huì)創(chuàng)建一個(gè) session 對(duì)象降狠,生成一個(gè)類似于 key,value 的鍵值對(duì)庇楞,然后將 key(cookie) 返回到瀏覽器(客戶)端榜配,瀏覽器下次再訪問(wèn)時(shí),攜帶 key(cookie)吕晌,找到對(duì)應(yīng)的 session(value)芥牌。

示例代碼

設(shè)置 Session :

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {

  async index() {

    // ?????? 設(shè)置 session
    this.ctx.session.username = 'Andy';

    // 顯示表單頁(yè)面,加載并渲染 HTML 模版文件
    // this.ctx.csrf 用戶訪問(wèn)頁(yè)面時(shí)生成的密鑰
    await this.ctx.render('home');
  }
}

module.exports = HomeController;

獲取 Session:

'use strict';

const Controller = require('egg').Controller;

class NewsController extends Controller {

  // 獲取數(shù)據(jù)顯示到新聞頁(yè)面
  async index() {

    // ?????? 獲取 session 值
    const username = this.ctx.session.username;
    console.log(username);

    // 調(diào)用 Service 層方法
    const listInfo = await this.service.news.getNewsList();
    // 渲染模版引擎
    await this.ctx.render('news', { list: listInfo });
  }
}

module.exports = NewsController;

設(shè)置 Session 的有效期

方法一:

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {

  async index() {

    // 設(shè)置 session
    this.ctx.session.username = 'Andy';

    // ?????? 設(shè)置 Session 的過(guò)期時(shí)間(基于 Cookies)聂使,默認(rèn)過(guò)期時(shí)間 24H.
    this.ctx.session.maxAge = 2000;


    // 顯示表單頁(yè)面壁拉,加載并渲染 HTML 模版文件
    // this.ctx.csrf 用戶訪問(wèn)頁(yè)面時(shí)生成的密鑰
    await this.ctx.render('home');
  }
}

module.exports = HomeController;

方法二(全局配置)

推薦在 config.default.js 文件中設(shè)置 Session。

因?yàn)?Session 是基于 Cookies 的柏靶,所以 Session 的配置和 Cookies 基本是一樣的弃理,可以使用 Cookies 里面的配置:

  // 配置 Session
  config.session = {
    key: 'SESSION_ID', // 設(shè)置 Session cookies 里面的 key
    maxAge: 24 * 3600 * 1000, // 1 天
    httpOnly: true,
    encrypt: true,
    renew: true, // 每次刷新頁(yè)面,Session 都會(huì)被延期屎蜓。
  };
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痘昌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炬转,更是在濱河造成了極大的恐慌辆苔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼劈,死亡現(xiàn)場(chǎng)離奇詭異驻啤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荐吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)骑冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人先煎,你說(shuō)我怎么就攤上這事贼涩。” “怎么了薯蝎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵遥倦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我占锯,道長(zhǎng)袒哥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任烟央,我火速辦了婚禮统诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疑俭。我一直安慰自己粮呢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钞艇。 她就那樣靜靜地躺著啄寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哩照。 梳的紋絲不亂的頭發(fā)上挺物,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音飘弧,去河邊找鬼识藤。 笑死砚著,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痴昧。 我是一名探鬼主播稽穆,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赶撰!你這毒婦竟也來(lái)了舌镶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豪娜,失蹤者是張志新(化名)和其女友劉穎餐胀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘤载,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡否灾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惕虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟冲。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溃蔫,靈堂內(nèi)的尸體忽然破棺而出健提,到底是詐尸還是另有隱情,我是刑警寧澤伟叛,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布私痹,位于F島的核電站,受9級(jí)特大地震影響统刮,放射性物質(zhì)發(fā)生泄漏紊遵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一侥蒙、第九天 我趴在偏房一處隱蔽的房頂上張望暗膜。 院中可真熱鬧,春花似錦鞭衩、人聲如沸学搜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瑞佩。三九已至,卻和暖如春坯台,著一層夾襖步出監(jiān)牢的瞬間炬丸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蜒蕾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠炬,地道東北人焕阿。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酸纲,于是被迫代替她去往敵國(guó)和親捣鲸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容