跨域的原理
- 跨域是由于浏览器的同源策略,是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击,另外跨域的情况是请求发出去了,在浏览器端拦截
- 跨域场景简单来说,协议、主域名、子域名、端口号不一样导致的
URL 说明 是否允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js 同一域名,不同文件或路径 允许
http://www.domain.com/lab/c.js
http://www.domain.com:8000/a.js
http://www.domain.com/b.js 同一域名,不同端口 不允许
http://www.domain.com/a.js
https://www.domain.com/b.js 同一域名,不同协议 不允许
http://www.domain.com/a.js
http://192.168.4.12/b.js 域名和域名对应相同ip 不允许
http://www.domain.com/a.js
http://x.domain.com/b.js 主域相同,子域不同 不允许
http://domain.com/c.js
http://www.domain1.com/a.js
http://www.domain2.com/b.js 不同域名 不允许
跨域的方法(123了解,4重点)
通过jsonp跨域
- 缺点:jsonp只能发送get请求,不能请求post请求
通过iframe跨域
通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。了解就行
- document.domain + iframe跨域
- location.hash + iframe
- window.name + iframe跨域
跨域资源共享(CORS)
- CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
反向代理,nginx/node跨域
- 浏览器访问后端服务器,遇到前面的跨域场景,就会出现跨域情况,原因是浏览器的同源策略
- 浏览器去访问nginx/node服务器,nginx/node服务器去访问后端服务器,服务器访问服务器就不存在跨域了
node跨域: vue框架的跨域(开发环境)
webpack.config.js部分配置:
module.exports = {
entry: {},
module: {},
...
devServer: {
historyApiFallback: true,
proxy: [{
context: '/login',
target: 'http://www.domain2.com:8080', // 代理跨域目标接口
changeOrigin: true,
secure: false, // 当代理某些https服务报错时用
cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改
}],
noInfo: true
}
}
nginx跨域具体配置:(生产环境)
#proxy服务器
server {
listen 81;
server_name www.domain1.com;
location / {
proxy_pass http://www.domain2.com:8080; #反向代理
proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
index index.html index.htm;
# 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用
add_header Access-Control-Allow-Origin http://www.domain1.com; #当前端只跨域不带cookie时,可为*
add_header Access-Control-Allow-Credentials true;
}
}