express中session的存儲與銷毀


1、首先在使用session之前需要先配置session的過期時間等,在入口文件app.js中

app.use(express.session({
        cookie: {
            maxAge: config.get("secret.maxAge")   //這里就是設置了session的過期時間,配置文件中是120000,即20分鍾。
        },
        secret: config.get("secret.sessionSecret"),
        store: new RedisStore({
            host: config.get("session_server").ip,
            port: config.get("session_server").port, 
            prefix: config.get("session_server").prefix
            //,db:'mydb'  //此屬性可選。redis可以進行分庫操作。若無此參數,則不進行分庫
        })
    }));
}

2、在現在做的系統中,登陸請求成功之后,服務器存儲了一個session,代碼

req.session.username = user.userName;//存儲的是一個用戶名


3、用戶登陸之后的操作在路由的攔截器里面校驗session,校驗成功之后為此session增加20分鍾的過期時間。
exports.checkTBLogin = function(req, cb) {
    if(req.session && req.session.loginTB){
        console.log("req.session.---------------"+req.session.loginTB);
        console.log(' req.session.cookie.expires============'+ req.session.cookie.expires);
        req.session.cookie.expires= new Date(Date.now() + 20 * 60 * 1000);
        return cb(null);
    }else{
        return cb(null, "login");
    }
    return cb(null, "login");
};

 

4、用戶點擊退出的額時候,銷毀session

req.session.destroy();

5、考慮到網站安全的問題,用戶做任何操作的時候都要驗證session。session的生命周期決定這種方式也不是絕對安全的,
假如用戶已經登錄了,攻擊者截取到了用戶發送到服務器的請求,用請求里的sessionid,去做其他操作,只要被截取的用戶在線,服務器上這個session沒有過期,那操作都能成功。
6、session的生命周期
當一個Session開始時,Servlet容器會創建一個HttpSession對象,那么在HttpSession對象中,可以存放用戶狀態的信息。
Servlet容器為HttpSession對象分配一個唯一標識符即Sessionid,Servlet容器把Sessionid作為一種Cookie保存在客戶端的 *瀏覽器* 中。

    用戶每次發出Http請求時,Servlet容器會從HttpServletRequest對象中取出Sessionid,然后根據這個Sessionid找到相應的HttpSession對象,從而獲取用戶的狀態信息。

我們知道Session是存在於服務器端的,當把瀏覽器關閉時,瀏覽器並沒有向服務器發送

任何請求來關閉Session,自然Session也不會被銷毀,但是可以做一點努力,在所有的

客戶端頁面里使用js的window.onclose來監視瀏覽器的關閉動作,然后向服務器發送一

個請求來關閉Session,但是這種做法在實際的開發中也是不推薦使用的,最正常的辦法

就是不去管它,讓它等到默認的時間后,自動銷毀。

那么為什么當我們關閉瀏覽器后,就再也訪問不到之前的session了呢?

其實之前的Session一直都在服務器端,而當我們關閉瀏覽器時,此時的Cookie是存在

於瀏覽器的進程中的,當瀏覽器關閉時,Cookie也就不存在了。

其實Cookie有兩種:

  • 一種是存在於瀏覽器的進程中;
  • 一種是存在於硬盤上

而session的Cookie是存在於瀏覽器的進程中,那么這種Cookie我們稱為會話Cookie,

當我們重新打開瀏覽器窗口時,之前的Cookie中存放的Sessionid已經不存在了,此時

服務器從HttpServletRequest對象中沒有檢查到sessionid,服務器會再發送一個新的存

有Sessionid的Cookie到客戶端的瀏覽器中,此時對應的是一個新的會話,而服務器上

原先的session等到它的默認時間到之后,便會自動銷毀。

 

當在同一個瀏覽器中同時打開多個標簽,發送同一個請求或不同的請求,仍是同一個session;

當不在同一個窗口中打開相同的瀏覽器時,發送請求,仍是同一個session;

當使用不同的瀏覽器時,發送請求,即使發送相同的請求,是不同的session;

當把當前某個瀏覽器的窗口全關閉,再打開,發起相同的請求時,就是本文所闡述的,是不同的session,但是它和session的生命周期是沒有關系的.


免責聲明!

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



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