satoken has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
时间: 2025-06-23 10:51:57 浏览: 13
### satoken CORS 策略预检请求解决方案
当遇到跨域资源共享(CORS)问题时,浏览器会自动发送一个预检请求(preflight request),通常使用 OPTIONS 方法来检查服务器是否允许实际的请求。如果服务器未正确配置 CORS 策略,则会导致预检请求失败,并提示缺少 `Access-Control-Allow-Origin` 响应头[^1]。
为了解决这个问题,需要确保服务器端正确处理预检请求,并返回必要的 CORS 响应头。以下是详细的解决方法:
#### 1. 配置服务器端支持 CORS
服务器端需要显式地允许来自特定源或所有源的跨域请求。这可以通过设置以下响应头实现:
- **Access-Control-Allow-Origin**: 指定允许访问资源的域名。例如:`http://example.com` 或者通配符 `*` 表示允许所有来源。
- **Access-Control-Allow-Methods**: 列出允许的 HTTP 方法,例如:`POST, GET, OPTIONS, DELETE`。
- **Access-Control-Allow-Headers**: 指定允许的自定义请求头,例如:`Content-Type, Authorization`。
- **Access-Control-Allow-Credentials**: 如果需要携带用户凭据(如 Cookie),则需设置为 `true`[^3]。
以 Java Spring Boot 为例,可以使用以下代码配置全局 CORS 支持:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允许所有路径
.allowedOrigins("http://example.com") // 允许的来源
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的方法
.allowedHeaders("Content-Type", "Authorization") // 允许的头部
.allowCredentials(true); // 是否允许携带凭据
}
}
```
#### 2. 处理预检请求
对于预检请求,服务器必须能够正确响应 OPTIONS 请求,并返回上述 CORS 响应头。例如,在 Node.js 中可以这样处理:
```javascript
app.options('*', (req, res) => {
res.header('Access-Control-Allow-Origin', 'http://example.com');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.send(204); // 返回无内容状态码
});
```
#### 3. 客户端调整
如果客户端发送了额外的自定义头部(例如 `X-Requested-With`),需要确保这些头部也被包含在服务器的 `Access-Control-Allow-Headers` 中[^3]。此外,确保 XMLHttpRequest 或 Fetch API 的请求中设置了正确的选项。例如:
```javascript
var req = new XMLHttpRequest();
req.open('GET', 'https://example.com/api/resource', true);
req.setRequestHeader('Authorization', 'Bearer token');
req.withCredentials = true; // 如果需要携带凭据
req.send();
```
#### 4. 验证配置
完成服务器端配置后,可以通过浏览器开发者工具或 Postman 测试 OPTIONS 请求,确认服务器返回了正确的 CORS 响应头。例如:
```
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
```
通过以上步骤,可以有效解决预检请求失败的问题,并确保跨域请求正常工作。
---
阅读全文
相关推荐












