HTTP session 提供了一種跨多個(gè)請(qǐng)求存儲(chǔ)用戶信息的方法,這對(duì)于 MVC 應(yīng)用程序特別有用。
首先安裝所需的包(以及 TypeScript 用戶的類型):
$ npm i express-session
$ npm i -D @types/express-session
安裝完成后,將 express-session 中間件應(yīng)用為全局中間件(例如,在 main.ts 文件中)。
import * as session from 'express-session';
// 在你初始化文件的地方
app.use(
session({
secret: 'my-secret',
resave: false,
saveUninitialized: false,
}),
);
注意 默認(rèn)的服務(wù)器端會(huì)話存儲(chǔ)故意不是為生產(chǎn)環(huán)境設(shè)計(jì)的。 它在大多數(shù)情況下會(huì)泄漏內(nèi)存,不會(huì)擴(kuò)展到單個(gè)進(jìn)程,并且用于調(diào)試和開發(fā)。
密鑰用于簽署會(huì)話 ID cookie。這可以是單個(gè)密鑰的字符串,也可以是多個(gè)密鑰的數(shù)組。如果提供了一個(gè)密鑰數(shù)組,則只有第一個(gè)元素將用于簽署會(huì)話 ID cookie,而在驗(yàn)證請(qǐng)求中的簽名時(shí)將考慮所有元素。密鑰本身不應(yīng)被別人輕易解析,最好是一組隨機(jī)字符。
啟用 resave 選項(xiàng)會(huì)強(qiáng)制將會(huì)話保存回會(huì)話存儲(chǔ)區(qū),即使在請(qǐng)求期間從未修改過會(huì)話。默認(rèn)值為 true,但不推薦使用默認(rèn)值,因?yàn)槟J(rèn)值將來會(huì)更改。
同樣,啟用 saveUninitialized 選項(xiàng)會(huì)強(qiáng)制將“未初始化”的會(huì)話保存到存儲(chǔ)中。當(dāng)一個(gè)會(huì)話是新的但未被修改時(shí),它是未初始化的。選擇 false 對(duì)于實(shí)現(xiàn)登錄會(huì)話、減少服務(wù)器存儲(chǔ)使用或遵守在設(shè)置 cookie 之前需要許可的法律很有用。選擇 false 還有助于解決競(jìng)爭(zhēng)條件,即客戶端在沒有會(huì)話的情況下發(fā)出多個(gè)并行請(qǐng)求。
我們可以將其他幾個(gè)選項(xiàng)傳遞給會(huì)話中間件。
注意 : secure: true 是推薦的選項(xiàng)。 但是,它需要啟用 https 的網(wǎng)站,即安全 cookie 需要 HTTPS。 如果設(shè)置了安全,并且通過 HTTP 訪問我們的站點(diǎn),則不會(huì)設(shè)置 cookie。 如果 node.js 位于代理后面并且使用的是 secure: true,則需要在 express 中設(shè)置“信任代理”。
有了這個(gè),我們現(xiàn)在可以從路由處理程序中設(shè)置和讀取會(huì)話值,如下所示:
@Get()
findAll(@Req() request: Request) {
request.session.visits = request.session.visits ? request.session.visits + 1 : 1;
}
@Req() 裝飾器是從 @nestjs/common 導(dǎo)入的,而 Request 是從 express 包導(dǎo)入的。
或者,我們可以使用 @Session() 裝飾器從請(qǐng)求中提取 session 對(duì)象,如下所示:
@Get()
findAll(@Session() session: Record<string, any>) {
session.visits = session.visits ? session.visits + 1 : 1;
}
@Session() 裝飾器是從 @nestjs/common 包中導(dǎo)入的。
首先安裝所需的包:
$ npm i fastify-secure-session
安裝完成后,注冊(cè) 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',
});
我們還可以預(yù)先生成密鑰或使用密鑰輪換。
在官方存儲(chǔ)庫中閱讀有關(guān)可用選項(xiàng)的更多信息。
有了這個(gè),我們現(xiàn)在可以從路由處理程序中設(shè)置和讀取會(huì)話值,如下所示:
@Get()
findAll(@Req() request: FastifyRequest) {
const visits = request.session.get('visits');
request.session.set('visits', visits ? visits + 1 : 1);
}
或者,我們可以使用 @Session() 裝飾器從請(qǐng)求中提取會(huì)話對(duì)象,如下所示:
@Get()
findAll(@Session() session: secureSession.Session) {
const visits = session.get('visits');
session.set('visits', visits ? visits + 1 : 1);
}
提示 @Session() 裝飾器是從@nestjs/common 導(dǎo)入的,而secureSession.Session 是從fastify-secure-session 包中導(dǎo)入的(導(dǎo)入語句:import * as secureSession from 'fastify-secure-session' )。
更多建議: