返回
跨域了怎么办?No 'Access-Control-Allow-Origin' header is present on the requested resource!
前端
2024-01-28 05:11:01
跨域问题详解:原因、解决方案和配置示例
跨域是什么?
在前端开发中,跨域是一个常见问题。它指的是由于浏览器安全限制,来自不同源的网页或脚本无法访问或读取彼此的资源。
跨域产生原因
为了保护用户数据,浏览器实施了同源策略。同源是指两个网页或脚本具有相同的协议、域名和端口号。如果不同,就会产生跨域。
跨域解决方案
解决跨域问题的常用方法包括:
- CORS(跨域资源共享): 服务器通过 HTTP 头部指定哪些源可以访问其资源。
- JSONP(JSON with Padding): 利用
<script>
标签跨域加载资源。 - 代理服务器: 作为中间人转发跨域请求。
- WebSocket: 双向通信协议,不受跨域限制。
- Service Worker: 可拦截和处理网络请求,规避跨域限制。
跨域配置示例
以 Nginx + Tomcat + Spring Boot + Vue 项目为例,跨域配置步骤如下:
Nginx 配置
location /api {
proxy_pass http://localhost:8080/api;
proxy_set_header Access-Control-Allow-Origin *;
proxy_set_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS;
proxy_set_header Access-Control-Allow-Headers Content-Type, Authorization;
}
Spring Boot 配置
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(Arrays.asList("Content-Type", "Authorization"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
Vue 配置
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
完成上述配置后,跨域问题即可得到解决。
常见问题解答
- 什么是同源策略?
它限制了不同源的网页或脚本的交互,以保护用户数据安全。 - 为什么跨域会成为问题?
它阻碍了前端与后端交互、跨域资源加载等操作。 - 如何选择跨域解决方案?
根据项目需求和技术栈选择最合适的解决方案。 - CORS 是如何工作的?
它允许服务器通过 HTTP 头部指定可以访问其资源的源。 - JSONP 存在哪些缺点?
它仅适用于获取 JSON 数据,并且容易受到 JSON 劫持攻击。