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