W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
HTTP session 提供了一種跨多個請求存儲用戶信息的方法,這對于 MVC 應用程序特別有用。
首先安裝所需的包(以及 TypeScript 用戶的類型):
$ npm i express-session
$ npm i -D @types/express-session
安裝完成后,將 express-session 中間件應用為全局中間件(例如,在 main.ts 文件中)。
import * as session from 'express-session';
// 在你初始化文件的地方
app.use(
session({
secret: 'my-secret',
resave: false,
saveUninitialized: false,
}),
);
注意 默認的服務器端會話存儲故意不是為生產環(huán)境設計的。 它在大多數(shù)情況下會泄漏內存,不會擴展到單個進程,并且用于調試和開發(fā)。
密鑰用于簽署會話 ID cookie。這可以是單個密鑰的字符串,也可以是多個密鑰的數(shù)組。如果提供了一個密鑰數(shù)組,則只有第一個元素將用于簽署會話 ID cookie,而在驗證請求中的簽名時將考慮所有元素。密鑰本身不應被別人輕易解析,最好是一組隨機字符。
啟用 resave 選項會強制將會話保存回會話存儲區(qū),即使在請求期間從未修改過會話。默認值為 true,但不推薦使用默認值,因為默認值將來會更改。
同樣,啟用 saveUninitialized 選項會強制將“未初始化”的會話保存到存儲中。當一個會話是新的但未被修改時,它是未初始化的。選擇 false 對于實現(xiàn)登錄會話、減少服務器存儲使用或遵守在設置 cookie 之前需要許可的法律很有用。選擇 false 還有助于解決競爭條件,即客戶端在沒有會話的情況下發(fā)出多個并行請求。
我們可以將其他幾個選項傳遞給會話中間件。
注意 : secure: true 是推薦的選項。 但是,它需要啟用 https 的網(wǎng)站,即安全 cookie 需要 HTTPS。 如果設置了安全,并且通過 HTTP 訪問我們的站點,則不會設置 cookie。 如果 node.js 位于代理后面并且使用的是 secure: true,則需要在 express 中設置“信任代理”。
有了這個,我們現(xiàn)在可以從路由處理程序中設置和讀取會話值,如下所示:
@Get()
findAll(@Req() request: Request) {
request.session.visits = request.session.visits ? request.session.visits + 1 : 1;
}
@Req() 裝飾器是從 @nestjs/common 導入的,而 Request 是從 express 包導入的。
或者,我們可以使用 @Session() 裝飾器從請求中提取 session 對象,如下所示:
@Get()
findAll(@Session() session: Record<string, any>) {
session.visits = session.visits ? session.visits + 1 : 1;
}
@Session() 裝飾器是從 @nestjs/common 包中導入的。
首先安裝所需的包:
$ npm i fastify-secure-session
安裝完成后,注冊 fastify-secure-session 插件:
import secureSession from 'fastify-secure-session';
// 在你初始化文件的地方
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
await app.register(secureSession, {
secret: 'averylogphrasebiggerthanthirtytwochars',
salt: 'mq9hDxBVDbspDR6n',
});
我們還可以預先生成密鑰或使用密鑰輪換。
在官方存儲庫中閱讀有關可用選項的更多信息。
有了這個,我們現(xiàn)在可以從路由處理程序中設置和讀取會話值,如下所示:
@Get()
findAll(@Req() request: FastifyRequest) {
const visits = request.session.get('visits');
request.session.set('visits', visits ? visits + 1 : 1);
}
或者,我們可以使用 @Session() 裝飾器從請求中提取會話對象,如下所示:
@Get()
findAll(@Session() session: secureSession.Session) {
const visits = session.get('visits');
session.set('visits', visits ? visits + 1 : 1);
}
提示 @Session() 裝飾器是從@nestjs/common 導入的,而secureSession.Session 是從fastify-secure-session 包中導入的(導入語句:import * as secureSession from 'fastify-secure-session' )。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: