会话(Session)是Web开发中用于跟踪用户状态的机制,它允许服务器在多个HTTP请求之间保持用户数据。在Express应用中,通常使用express-session
中间件来实现会话管理。
当每个请求都创建新会话时,通常是由以下原因导致的:
express-session
中间件顺序不正确const express = require('express');
const session = require('express-session');
const app = express();
// 使用内存存储(仅用于开发)
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: false, // 开发环境设为false,生产环境应设为true(HTTPS)
maxAge: 24 * 60 * 60 * 1000 // 24小时
}
}));
const MongoStore = require('connect-mongo');
app.use(session({
secret: 'your-secret-key',
store: MongoStore.create({
mongoUrl: 'mongodb://localhost:27017/session_db'
}),
resave: false,
saveUninitialized: false,
cookie: {
secure: false,
maxAge: 24 * 60 * 60 * 1000
}
}));
确保Angular的HTTP请求携带凭据:
// 在app.module.ts中
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
@NgModule({
imports: [
HttpClientModule
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
]
})
export class AppModule { }
// auth.interceptor.ts
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler) {
const clonedReq = req.clone({
withCredentials: true
});
return next.handle(clonedReq);
}
}
如果前后端分离部署,需要配置CORS:
const cors = require('cors');
app.use(cors({
origin: 'http://your-angular-app-domain',
credentials: true
}));
添加测试路由验证会话:
app.get('/session-test', (req, res) => {
if (!req.session.views) {
req.session.views = 0;
}
req.session.views++;
res.send(`Views: ${req.session.views}`);
});
express-session
应在路由前配置通过以上配置和验证步骤,应该能够解决每个请求创建新会话的问题。
没有搜到相关的文章