面试题答案
一键面试预检请求产生的场景
当浏览器发起跨域请求,且该请求不是简单请求(满足以下条件的为简单请求:1. 使用GET、POST或HEAD方法;2. Content-Type 为 application/x-www-form-urlencoded、multipart/form-data 或 text/plain;3. 没有自定义头部字段)时,浏览器会先发送一个 OPTIONS 请求,即预检请求。
预检请求的作用
- 安全验证:服务器通过预检请求,检查实际请求是否安全,比如是否允许跨域,允许哪些请求方法、头部字段等。避免潜在的安全风险,如恶意请求。
- 协商权限:浏览器和服务器在实际请求发送前,通过预检请求协商跨域请求的权限,确保实际请求能够被服务器正确处理。
在Node.js(使用Express框架)中处理预检请求
const express = require('express');
const app = express();
// 处理预检请求
app.options('*', (req, res) => {
// 设置允许跨域的响应头
res.set('Access-Control-Allow-Origin', '*');
res.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.status(200).send();
});
// 处理实际的跨域请求
app.use((req, res, next) => {
res.set('Access-Control-Allow-Origin', '*');
next();
});
// 其他路由和中间件
app.get('/', (req, res) => {
res.send('Hello World!');
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
在上述代码中:
- 处理预检请求:
app.options('*', ...)
表示对所有路径的 OPTIONS 请求进行处理。在处理函数中,设置了允许跨域的响应头,包括允许的源(Access-Control-Allow-Origin
)、请求方法(Access-Control-Allow-Methods
)和头部字段(Access-Control-Allow-Headers
),然后返回状态码200。 - 处理实际跨域请求:通过
app.use((req, res, next) => {...})
中间件设置允许跨域的源,确保实际请求能够顺利通过跨域检查。