面试题答案
一键面试1. CORS 配置优化
设计思路
- 允许的源管理:使用白名单机制,明确允许哪些前端应用的域可以访问服务,避免开放过于宽松的访问权限。
- HTTP 方法和头信息:根据实际需求,允许必要的 HTTP 方法(如 GET、POST、PUT、DELETE 等)以及前端可能会发送的自定义头信息。
- 预检请求处理:对于复杂请求(如非简单请求,涉及自定义头或不同 HTTP 方法),优化预检请求的缓存,减少不必要的重复预检。
关键代码实现
使用 express
框架为例:
const express = require('express');
const app = express();
const cors = require('cors');
// 配置 CORS 白名单
const whitelist = ['http://frontend1.com', 'http://frontend2.com'];
const corsOptions = {
origin: function (origin, callback) {
if (whitelist.indexOf(origin)!== -1 ||!origin) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
preflightContinue: false,
optionsSuccessStatus: 204
};
app.use(cors(corsOptions));
// 其他路由和中间件
app.get('/', (req, res) => {
res.send('Hello World!');
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
2. 防止跨域伪造请求(CSRF)
设计思路
- CSRF Token 生成与验证:为每个用户会话生成一个唯一的 CSRF Token,在用户登录或会话开始时创建,并存储在服务器端(如 session 中)。前端在每次请求时携带该 Token,服务器进行验证。
- Token 存储与传输:Token 可以存储在 cookie 中,并通过自定义头信息传输到服务器,避免在 URL 中暴露。
- Token 有效期管理:设置合理的 Token 有效期,过期后要求用户重新获取新的 Token。
关键代码实现
同样以 express
为例,结合 express-session
来管理会话:
const express = require('express');
const session = require('express-session');
const csrf = require('csurf');
const app = express();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
const csrfProtection = csrf({ cookie: true });
// 生成 CSRF Token 并传递给前端
app.get('/csrf-token', csrfProtection, (req, res) => {
res.json({ csrfToken: req.csrfToken() });
});
// 需要验证 CSRF Token 的路由
app.post('/protected', csrfProtection, (req, res) => {
res.send('CSRF Token 验证成功');
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
3. 高并发场景下性能优化
设计思路
- 缓存策略:对于 CORS 预检请求,设置合理的缓存机制,如使用
Cache-Control
头信息,减少重复的预检请求处理。 - 异步处理:在处理 CSRF Token 验证等操作时,尽量使用异步函数和非阻塞 I/O 操作,避免高并发时的阻塞。
- 负载均衡:在高并发场景下,引入负载均衡器(如 Nginx),将请求均匀分配到多个服务器实例上,减轻单个服务器的压力。
关键代码实现(缓存 CORS 预检请求示例)
在 cors
配置中添加缓存相关设置:
const corsOptions = {
origin: function (origin, callback) {
if (whitelist.indexOf(origin)!== -1 ||!origin) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
preflightContinue: false,
optionsSuccessStatus: 204,
// 缓存预检请求 1 小时
maxAge: 3600
};
通过以上设计思路和关键代码实现,可以在 Node.js 的 HTTP 服务中实现一套全面的跨域解决方案,同时兼顾安全性和高并发场景下的性能。