国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node.js中Koa2如何使用Session完成登錄狀態(tài)保持?

VincentFF / 1376人閱讀

摘要:使用的中間件是一個簡潔的框架,把許多小功能都拆分成了中間件,用一個洋蔥模型保證了中間件豐富的可拓展性,我們要使用來保持登錄狀態(tài),就需要引用中間件。默認(rèn)是過期時間,以毫秒為單位計算。自動提交到響應(yīng)頭。默認(rèn)是是否在快過期時刷新的有效期。

項目要用到登錄注冊,就需要使用到Cookie和Session來保持登錄狀態(tài),于是就簡單研究了一下
Cookie和Session的工作原理

前面已經(jīng)專門發(fā)過一篇帖子記錄Cookie和Session的工作原理了,不明白的小伙伴可以看看Cookie、Session是如何保持登錄狀態(tài)的?。

使用Koa的Session中間件

Koa是一個簡潔的框架,把許多小功能都拆分成了中間件,用一個洋蔥模型保證了中間件豐富的可拓展性,我們要使用Session來保持登錄狀態(tài),就需要引用Session中間件。

安裝Koa-Session中間件
npm install koa-session --save

如果需要使用TypeScript進(jìn)行開發(fā),則需要引入對應(yīng)的TS類型聲明

npm install @types/koa-session --save
配置Session

Koa-Session需要做一些配置:

const session_signed_key = ["some secret hurr"];  // 這個是配合signed屬性的簽名key
const session_config = {
    key: "koa:sess", /**  cookie的key。 (默認(rèn)是 koa:sess) */
    maxAge: 4000,   /**  session 過期時間,以毫秒ms為單位計算 。*/
    autoCommit: true, /** 自動提交到響應(yīng)頭。(默認(rèn)是 true) */
    overwrite: true, /** 是否允許重寫 。(默認(rèn)是 true) */
    httpOnly: true, /** 是否設(shè)置HttpOnly,如果在Cookie中設(shè)置了"HttpOnly"屬性,那么通過程序(JS腳本、Applet等)將無法讀取到Cookie信息,這樣能有效的防止XSS攻擊。  (默認(rèn) true) */
    signed: true, /** 是否簽名。(默認(rèn)是 true) */
    rolling: true, /** 是否每次響應(yīng)時刷新Session的有效期。(默認(rèn)是 false) */
    renew: false, /** 是否在Session快過期時刷新Session的有效期。(默認(rèn)是 false) */
};

我們需要關(guān)注這幾個配置:

renew rolling

這兩個都可以在用戶訪問的過程中刷新有效期,不至于讓用戶訪問過程中Session過期成為未登錄狀態(tài)

signed

這個是對客戶端Cookie的簽名,也就是用一個特點的字符加密,保證客戶端Cookie不會被偽造出來

httpOnly

打開這個使得通過程序(JS腳本、Applet等)無法讀取Cookie,大大提高了安全性

maxAge

以ms為單位的過期時間

簡單的使用

首先理一下思路

判斷訪問者的Session有沒有過登錄記錄屬性

如果有且值為true,則為已登錄,否則為未登錄

如果為已登錄,則不執(zhí)行判斷,直接返回已登錄,如果為未登錄,則執(zhí)行下一步登錄驗證

如果驗證成功,則返回的登錄成功,并且在它的session中記下登錄屬性為true,如果驗證失敗,則返回登錄失敗。

為了測試方便,以下用Get請求和一個固定的賬號密碼代替數(shù)據(jù)庫查詢,實際開發(fā)應(yīng)該使用POST和數(shù)據(jù)庫比對。同時為了測試方便,將過期時間設(shè)置為4000ms,便于快速看到Cookies過期,實際開發(fā)應(yīng)該設(shè)置長一些,比如幾小時甚至幾天,取決于業(yè)務(wù)需求。
const Koa = require("koa");                               // 導(dǎo)入Koa
const Koa_Session = require("koa-session");   // 導(dǎo)入koa-session     
// 配置
const session_signed_key = ["some secret hurr"];  // 這個是配合signed屬性的簽名key
const session_config = {
    key: "koa:sess", /**  cookie的key。 (默認(rèn)是 koa:sess) */
    maxAge: 4000,   /**  session 過期時間,以毫秒ms為單位計算 。*/
    autoCommit: true, /** 自動提交到響應(yīng)頭。(默認(rèn)是 true) */
    overwrite: true, /** 是否允許重寫 。(默認(rèn)是 true) */
    httpOnly: true, /** 是否設(shè)置HttpOnly,如果在Cookie中設(shè)置了"HttpOnly"屬性,那么通過程序(JS腳本、Applet等)將無法讀取到Cookie信息,這樣能有效的防止XSS攻擊。  (默認(rèn) true) */
    signed: true, /** 是否簽名。(默認(rèn)是 true) */
    rolling: true, /** 是否每次響應(yīng)時刷新Session的有效期。(默認(rèn)是 false) */
    renew: false, /** 是否在Session快過期時刷新Session的有效期。(默認(rèn)是 false) */
};

// 實例化
const app = new Koa();
const session = Koa_Session(session_config, app)
app.keys = session_signed_key;

// 使用中間件,注意有先后順序
app.use(session);

app.use(ctx => {
    const databaseUserName = "testSession";
    const databaseUserPasswd = "noDatabaseTest";
    // 對/favicon.ico網(wǎng)站圖標(biāo)請求忽略
    if (ctx.path === "/favicon.ico") return;

    if (!ctx.session.logged) {  // 如果登錄屬性為undefined或者false,對應(yīng)未登錄和登錄失敗
        // 設(shè)置登錄屬性為false
        ctx.session.logged = false;

        // 取請求url解析后的參數(shù)對象,方便比對
        // 如?nickname=post修改&passwd=123解析為{nickname:"post修改",passwd:"123"}
        let query = ctx.request.query;

        // 判斷用戶名密碼是否為空
        if (query.nickname && query.passwd) {

            // 比對并分情況返回結(jié)果  
            if (databaseUserName == query.nickname) {  // 如果存在該用戶名

                // 進(jìn)行密碼比對并返回結(jié)果 
                ctx.body = (databaseUserPasswd == query.passwd) ? "登錄成功" : "用戶名或密碼錯誤";
                ctx.session.logged = true;
            } else {                    // 如果不存在該用戶名                                           //  如果用戶名不存在
                ctx.body = "用戶名不存在";
            }
        } else {
            ctx.body = "用戶名密碼不能為空";
        }
    } else {
        ctx.body = "已登錄";
    }

}
);

app.listen(3000);
console.log("Koa運行在:http://127.0.0.1:3000");   

運行一下,控制臺輸出:

Koa運行在:http://127.0.0.1:3000

訪問http://127.0.0.1:3000,可以看到我們沒有填寫登錄參數(shù),然后返回了用戶名密碼不能空,并且按下F12,點擊Cookies再點擊http://127.0.0.1:3000,看到了我們的SessionId被記錄到了Cookies中,說明Session生效了。

我們靜置一會但不刷新頁面,再點擊Cookies后重新點擊,http://127.0.0.1:3000(刷新Cookies顯示),發(fā)現(xiàn)我們的SessionId不見了,說明我們的過期時間也生效了

我將Cookies的數(shù)據(jù)截詳細(xì)一點就是這樣的,可以看到有個過期時間:

我們再訪問http://127.0.0.1:3000/?nickname=123和http://127.0.0.1:3000/?passwd=123,都輸出了

訪問http://127.0.0.1:3000/?nickname=123&&passwd=123,輸出

訪問http://127.0.0.1:3000/?nickname=testSession&&passwd=123,輸出

最后嘗試正確的用戶名密碼http://127.0.0.1:3000/?nickname=testSession&&passwd=noDatabaseTest
,輸出
嘗試再次訪問http://127.0.0.1:3000/?nickname=testSession&&passwd=noDatabaseTest
,輸出

在有效期限內(nèi)訪問別的頁面http://127.0.0.1:3000/,輸出

有效期內(nèi)不斷刷新就能保持登錄狀態(tài)

有效期內(nèi)沒有重新操作頁面刷新狀態(tài)就會自然過期

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104153.html

相關(guān)文章

  • Node.js從入門到上線》入門篇 (持續(xù)更新

    摘要:最近利用空閑時間寫了一個從入門到上線的的實戰(zhàn)教程從入門到上線目前還在更新中,入門篇已基本成型。本項目使用語法,采用搭建了一個博客系統(tǒng),實現(xiàn)了文章管理用戶登錄注冊權(quán)限控制分類管理等功能。實現(xiàn)線上部署左手代碼右手磚拋磚引玉 最近利用空閑時間寫了一個從入門到上線的的node實戰(zhàn)教程《Node.js從入門到上線》A blog build with Koa2. 目前還在更新中,入門篇已基本成型。...

    CocoaChina 評論0 收藏0
  • EDU_BOOK 開發(fā)總結(jié)

    摘要:開發(fā)總結(jié)整體框架搭建是目前世界最火的框架,無論從性能,還是流程控制上,和它的后宮中間件都是非常好的解決方案。 EDU_BOOK 開發(fā)總結(jié) KOA2 + Mongodb 整體框架搭建API Koa2是目前Node.js世界最火的web框架,無論從性能,還是流程控制上,koa 2和它的后宮(中間件)都是非常好的解決方案。本文主要koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一...

    Yumenokanata 評論0 收藏0
  • 最好用的koa2+mysql的RESTful API腳手架,mvc架構(gòu),支持node調(diào)試,pm2部署

    摘要:基于構(gòu)建的服務(wù)器腳手架這是一個基于的輕量級腳手架,支持支持使用編寫。腳手架可以根據(jù)不同的環(huán)境配置不同的信息運行價值,支持開發(fā),測試,生產(chǎn)環(huán)境的不同參數(shù)配置。 #基于webpack構(gòu)建的 Koa2 restful API 服務(wù)器腳手架 這是一個基于 Koa2 的輕量級 RESTful API Server 腳手架,支持 ES6, 支持使用TypeScript編寫。 GIT地址:https...

    xiongzenghui 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<