一、跨域定义
跨域
指的是浏览器不能执行其他网站的脚本。它是由浏览器同源策略造成的,是浏览器对JavaScript施加的安全限制。
同源策略
是指协议,域名,端口都要相同,其中一个不同都会产生跨域;
三、跨域流程
非简单请求(PUT、DELETE) 等,需要先发送预检请求
1、浏览器-发送预检请求,OPTIONS
2、服务器-响应允许跨域
3、浏览器-发送真实请求
4、服务器响应数据
四、解决跨域
1、使用ngnix部署为同一域
举个栗子:
两个端口想互相访问接口 在http://b.b.com:80/Api中想访问 http://b.b.com:81/Api 那么进行如下配置即可使用nginx转发机制就可以完成跨域问题
server {
listen 80;
server_name b.b.com;
location /Api {
proxy_pass http://b.b.com:81/Api;
index index.html index.htm;
}
}
2、配置当次请求允许跨域
添加响应头
//支持哪些来源的请求跨域
response.setHeader("Access-Control-Allow-Origin", "*");
//支持哪些方法跨域
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
//表明该响应的有效时间为多少秒。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效
response.setHeader("Access-Control-Max-Age", "3600");
//跨域请求暴露的字段
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
//跨域请求默认不包含cookie,设置true可以包含cookie
Access-Control-Allow-Credentials
目前项目基本都是springboot开发,可用下面代码解决跨域问题
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 实现基本的跨域请求
* @author linhongcun
*
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
/*是否允许请求带有验证信息*/
corsConfiguration.setAllowCredentials(true);
/*允许访问的客户端域名*/
corsConfiguration.addAllowedOrigin("*");
/*允许服务端访问的客户端请求头*/
corsConfiguration.addAllowedHeader("*");
/*允许访问的方法名,GET POST等*/
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}