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

資訊專欄INFORMATION COLUMN

Express.js?中的 Sessions 如何工作?(譯)

Hydrogen / 1726人閱讀

世界上任何一個擁有用戶數(shù)據(jù)的 web 應(yīng)用都必須處理 sessions。作為一名開發(fā)者,我們必須要知道它們是什么以及如何處理它們。
在這篇文章中,我想要分享的是:

session 是什么?

session 如何存儲數(shù)據(jù)?

你如何決定存放 session 數(shù)據(jù)的位置?

在 sessions 工作時,你必須意識到的安全性上的影響有哪些?
在一些示例代碼中,我將會運用?session npm module ,它很有可能是最常見的 session 庫。

session 是什么?

session 是存儲你通過請求獲取到的數(shù)據(jù)的地方。每一個訪問你網(wǎng)站的用戶都有一個唯一的 session。當(dāng)他們?yōu)g覽你應(yīng)用的時候,你就可以使用 session 去存儲和獲取用戶數(shù)據(jù)。
session 對 web 應(yīng)用開發(fā)來講是必須有的,因為 session 允許應(yīng)用去存儲狀態(tài)。基于用戶在頁面 A 上的一個動作,我們就可以展示出一個不同的頁面 B。如果沒有 session,應(yīng)用將是無狀態(tài)的,而且很無用。
這里展示了你如何使用 Express 去建立一個簡單的 session

import express from "express";
import session from "express-session";
var app = express();
app.use(session());

如果你的應(yīng)用已經(jīng)有了可使用的 sessions, 你可以在一個路由處理中設(shè)置一些數(shù)據(jù):

app.use(session({ secret: "this-is-a-secret-token", cookie: { maxAge: 60000 }}));

// Access the session as req.session
app.get("/", function(req, res, next) {
  var sessData = req.session;
  sessData.someAttribute = "foo";
  res.send("Returning with some text");
});

在另一個路由處理中讀到它:

app.get("/bar", function(req, res, next) {
  var someAttribute = req.session.someAttribute;
  res.send(`This will print the attribute I set earlier: ${someAttribute}`);
});

sessions 可以用不同的方式存儲它們的信息。存儲 session 數(shù)據(jù)最受歡迎的方式有:

在應(yīng)用內(nèi)存中

在 cookie 中

在內(nèi)存緩存中

在數(shù)據(jù)庫中

使用應(yīng)用內(nèi)存存儲 session 數(shù)據(jù)

這是常見的最簡單的存儲方式,但在生產(chǎn)環(huán)境中不用。
用這種方式存儲從根本上意味著數(shù)據(jù)在應(yīng)用執(zhí)行時間中的有效期內(nèi)被存儲,一旦你的 web 應(yīng)用服務(wù)器宕機了或停止運行了,所有的 session 數(shù)據(jù)都會被移除。
在內(nèi)存中存儲 session 數(shù)據(jù)也會導(dǎo)致內(nèi)存泄露。當(dāng)你的應(yīng)用保持運行的時候,越來越多的內(nèi)存被占用,直到應(yīng)用因為內(nèi)存不足而退出。
為了開發(fā)的目的,把 session 數(shù)據(jù)存在內(nèi)存中經(jīng)常很有用。然而,這兒還有更好的存儲 session 數(shù)據(jù)的方式。

使用 cookie 存儲 session 數(shù)據(jù)

cookie 通常是從 web 服務(wù)器發(fā)送到你的 web 瀏覽器上的一小塊數(shù)據(jù)。它允許服務(wù)器存儲一個具體用戶相關(guān)的信息。
cookies 的一種常見用法就是存儲 session 數(shù)據(jù),它的工作流程是:
1、服務(wù)器發(fā)送一個 cookie 給 web 瀏覽器,并且在客戶端存儲一段時間(稱為 expiration time)。
2、當(dāng)用戶隨后向 web 服務(wù)器發(fā)起一個請求時,這個 cookie 會和這個請求一起發(fā)送,服務(wù)器可以讀到 cookie 中包含的信息。
3、如果需要的話,服務(wù)器可以修改 cookie,然后再把它返回給瀏覽器。
每次你發(fā)起一個請求,你的瀏覽器都會把 cookie 發(fā)送給服務(wù)器,直到 cookie 過期為止。
類似 express-session 這樣的模塊會給你提供一個友好的 API 和 sessions 一起工作(讓你可以獲取 & 設(shè)置 session 里的數(shù)據(jù) ),但是在底層,它可以通過 cookie 保存和恢復(fù)這個數(shù)據(jù)。

Express-session?也提供一些方法來保證你 cookies 的安全性。我們在這不會講述安全細(xì)節(jié),但是我推薦你通過閱讀文檔來詳細(xì)研究安全細(xì)則。這對于確保你應(yīng)用里的 cookie 信息不被暴露是非常重要的。
使用 cookie 存儲 session 數(shù)據(jù)也帶來了一些問題:
1、可以存儲的數(shù)據(jù)量很小,大約只有 4kb。
2、因為每次發(fā)送請求都會攜帶 cookie,如果你在 cookie 中存儲了一堆數(shù)據(jù),它將會增加請求中的數(shù)據(jù)量,從而導(dǎo)致你的網(wǎng)站性能降低。
3、如果攻擊者弄清楚了你的 cookies 是如何加密的,那么你的 cookies 就危險了。攻擊者將能讀到 cookies 中存儲的信息,這可是用戶敏感信息??!

使用內(nèi)存緩存存儲 session 數(shù)據(jù)

內(nèi)存緩存是可以存儲一小堆鍵值數(shù)據(jù)的地方。使用內(nèi)存緩存存儲 session 信息的最出名的兩個例子就是 ?Redis 和 ?Memcached。
在內(nèi)存緩存中存儲 session 數(shù)據(jù)的時候,服務(wù)器仍然使用 cookie,但是這個 cookie 只包含一個唯一的 sessionId。這個 sessionId 在服務(wù)器對儲存庫進行查找的時候使用。

使用內(nèi)存緩存的時候,你的 cookie 只包含一個 session ID。它避免了私人用戶信息被暴露在 cookie 中的危險。
使用內(nèi)存緩存存儲 session 數(shù)據(jù)的優(yōu)點:
1、基于鍵值對數(shù)據(jù)存儲,便于查找。
2、它們和你的應(yīng)用服務(wù)器分隔開來。這種分隔降低了依賴。
3、多帶帶一個內(nèi)存存儲可以服務(wù)好多個應(yīng)用。
4、通過移除老的 session 數(shù)據(jù)來自動管理內(nèi)存。
當(dāng)然,這種存儲方式也有一些缺點:
1、它們是另一臺服務(wù)器,需要進行建立和管理。
2、對一些小應(yīng)用來說可能是殺雞用了牛刀。一般這種情況的話,使用數(shù)據(jù)庫存儲或者 cookies 存儲效果更好。
3、重置緩存的唯一辦法就是移除所有存儲在它里面的 sessions。
下面的示例告訴你如何來用 express-session 來建立一個類似 Memcached 的內(nèi)存緩存,通過 ?connect-memcached 模塊。

var express      = require("express");
var session      = require("express-session");
var cookieParser = require("cookie-parser");
var app          = express();
var MemcachedStore = require("connect-memcached")(session);
 
app.use(cookieParser());
app.use(session({
      secret  : "some-private-key",
      key     : "test",
      proxy   : "true",
      store   : new MemcachedStore({
        hosts: ["127.0.0.1:11211"], //this should be where your Memcached server is running
        secret: "memcached-secret-key" // Optionally use transparent encryption for memcache session data 
    })
}));
使用數(shù)據(jù)庫存儲 session 數(shù)據(jù)

最后,我們談一下在傳統(tǒng)的數(shù)據(jù)庫中存儲 session 數(shù)據(jù),比如 MySQL 和 PostgreSQL。在大多數(shù)情況下,它以一種類似于在內(nèi)存中存儲 session 數(shù)據(jù)的方式來工作。
session cookie 仍然只含有一個 sessionId。在這種情況下,它將會匹配數(shù)據(jù)庫里的 session 表中的第一個 key 值。
總的來講,我不推薦使用數(shù)據(jù)庫來存儲 session 數(shù)據(jù),我這么做的唯一的理由是它需要花費大量精力去建立 ?Memcached? 或 Redis。
從數(shù)據(jù)庫中恢復(fù)數(shù)據(jù)比用內(nèi)存緩存恢復(fù)要慢的多,因為數(shù)據(jù)存儲在硬盤上,而不是內(nèi)存中。當(dāng)你把 session 數(shù)據(jù)存在數(shù)據(jù)庫里的時候,你會被數(shù)據(jù)庫暴擊的。。。。
另外,你必須自己全權(quán)管理老的 session 數(shù)據(jù)。如果你沒有移除老的 session 數(shù)據(jù),你的數(shù)據(jù)庫將被成千上萬條無用數(shù)據(jù)行占用。
這里有許多數(shù)據(jù)庫存儲,你可以使用 express-session。在 ?README 中查看完整列表。

你應(yīng)該在哪存儲你的 session 數(shù)據(jù)?

我們討論了常用的三種方式存儲來存儲你的 session 數(shù)據(jù)。那么你應(yīng)該在哪存儲你的 session 數(shù)據(jù)呢?
總的來說,我遵循這個規(guī)則:“內(nèi)存第一(譯者注:這里應(yīng)該是指內(nèi)存緩存),cookie 第二,最后是數(shù)據(jù)庫”。
如果你使用 Memcached 或 Redis,我會和你相伴。如果不是,把你的 session 數(shù)據(jù)存在 cookie,但一定要確保你私鑰的安全。最后,你可以把你的 session 數(shù)據(jù)存在數(shù)據(jù)庫里,但一定要有一個移除老 session 數(shù)據(jù)的計劃。
原文地址:http://nodewebapps.com/2017/0...

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

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

相關(guān)文章

  • 】測試驅(qū)動開發(fā):使用 Node.js 和 MongoDB 構(gòu)建 Todo API

    摘要:首先安裝單元測試環(huán)境使用模塊來模擬定義的模型。根據(jù)刪除這是單元測試的最后一小節(jié)。需要根據(jù)需求和單元測試用例來編寫應(yīng)用邏輯,使我們的程序更加穩(wěn)定。我們會運行自動測試用例,一直重構(gòu),直到所有單元測試都通過。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/746原文:https://semaphoreci.com/community/tutoria...

    邱勇 評論0 收藏0
  • 】測試驅(qū)動開發(fā):使用 Node.js 和 MongoDB 構(gòu)建 Todo API

    摘要:首先安裝單元測試環(huán)境使用模塊來模擬定義的模型。根據(jù)刪除這是單元測試的最后一小節(jié)。需要根據(jù)需求和單元測試用例來編寫應(yīng)用邏輯,使我們的程序更加穩(wěn)定。我們會運行自動測試用例,一直重構(gòu),直到所有單元測試都通過。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/746原文:https://semaphoreci.com/community/tutoria...

    tomener 評論0 收藏0
  • MEAN.js 文檔

    摘要:感謝使用框架本文檔涵蓋構(gòu)建應(yīng)用所需的基礎(chǔ)知識。用于數(shù)據(jù)校驗的組件及相關(guān)文件在此目錄進行管理。除了自定義中間件外,還是用了諸多第三方的中間件,它們是五測試我們使用組件對服務(wù)端代碼進行測試。識別當(dāng)前導(dǎo)航從已有導(dǎo)航中刪除給定標(biāo)識的導(dǎo)航配置。 本文同步至個人博客 MEAN.js 文檔,轉(zhuǎn)載請注明出處。 Overview 感謝使用 MEAN.js 框架! 本文檔涵蓋構(gòu)建 MEAN 應(yīng)用所需的基礎(chǔ)...

    Hydrogen 評論0 收藏0
  • []事件循環(huán),Node.js背后的核心概念

    摘要:事件處理器,則是當(dāng)指定事件觸發(fā)時,執(zhí)行的一段代碼。事件循環(huán)以一個無限循環(huán)的形式啟動,存在于二進制文件里函數(shù)的最后,當(dāng)沒有更多可被執(zhí)行的事件處理器時,它就退出。 前言 如果你了解過Node.js,那么你一定聽說過事件循環(huán)。你一定想知道它為什么那么特殊,并且為什么你需要關(guān)注它?此時此刻的你,可能已經(jīng)寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環(huán)。 在下文中,我們會先在一...

    Meils 評論0 收藏0

發(fā)表評論

0條評論

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