跨域,一个老生常谈的问题,但在此之前并没有实际遇到过这个问题,也就没怎么放在心上,然最近本地开发的时候遇到了,和想象中不一样,以为很快解决,还是花费了一定的时间去解决,现在把自己解决的方案进行总结,也避免大家之后采坑。
跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。也可以这么说url是由:协议、域名、端口 三部分组成。当一个请求url的协议、域名、端口三者之间的任意一个与当前页面url不同即为跨域。
同源策略(Same Orgin Policy)是一种约定,它是浏览器核心也最基本的安全功能,它会阻止一个域的js脚本和另外一个域的内容进行交互,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。。所谓同源(即在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。
以下是实际开发中vue项目解决本地开发环境解决跨域方案,本地真实有效
找到配置文件vue.config.js
设置代理,用来解决本地开发跨域问题,如果设置了代理,那你本地开发环境的axios的baseUrl要写为 ‘’ ,即空字符串
devServer: {
open: true, // 启动服务后是否打开浏览器
host: '0.0.0.0',
port: port, // 服务端口
https: false,
hotOnly: false,
proxy: '' // 设置代理
},
proxy: {
'/api': { // api改后的请求接口
target: 'http://www.baidu.com', // 后端接口地址
pathRewrite: { // 重新
'^/api': ''
}
}
}, // 设置代理
给大家说一个物理攻击方式(强制更改浏览器),不过说话说的好:狸猫花猫,捉住老鼠就是好猫。
open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/文件夹路径/MyChromeDevUserData
说明:以下解决方案是遇到问题是网上看到别的大神的解决方案,在这里一并总结过来,特别感谢余浩的博客
a–>b访问不了,可以找个中间的服务器c, 先访问c再从c到b,类似曲线救国。
明确访问的目的地,但是用户不知道中间的代理服务器。(忽略中间服务器)
a明确访问c代理服务器,但是不知道c的内容从哪里来,c反向从别的地方拿来数据。(忽略的是目标地址)
浏览器可以访问a,而服务器之间不存在跨域问题,浏览器先访问a的服务器c,让c服务器作为代理去访问b服务器,拿到之后再返回数据给a。
例如:
nginx是静态服务器,跨域请求放在api下面好管理http://www.baidu.com:80/api/user
可以在nginx下面的config下面的nginx.conf里面配置
从80端口进来的就拦截一下,代理到81端口
server{
location /api {
//拦截一下
proxy_pass http://www.baidu.com:81;
}
}
浏览器先询问b,b允许a访问
access-control-allow-origin
access-control-max-age
PHP端修改header:
header('Access-Control-Allow-Origin:*');//允许所有来源访问
header('Access-Control-Allow-Method:POST,GET');//允许访问的方式
**实现原理:**通常为了减轻web服务器的负载,我们把js、css、图片等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许。
html中有的标签天然支持跨域,比如但是只支持get请求。
特别感谢Husbin-出现跨域问题的原因及其解决方法
保证用户信息安全,防止恶意网站窃取数据。同源策略是必须的,否则cookie可以共享。
window.opener.postMessage(content,origin)
content是消息的具体内容,origin是协议 + 域名 + 端口
AJAX
元素,向服务器请求json数据,这种做法不受同源政策的限制,服务器收到请求后,将数据放在一个指定名字的回调函数里面传回来。(只能发GET请求)跨域资源共享(corss-origin resource
sharing):CORS需要浏览器和服务器同时支持。目前所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
http://www.ruanyifeng.com/blog/2016/04/cors.html
阮一峰-跨域资源共享 CORS 详解
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
阮一峰-浏览器同源政策及其规避方法
https://webpack.js.org/configuration/dev-server/
webpack文档
https://blog.moonlet.cn/archives/563
余浩的博客
https://www.jianshu.com/p/413a2f11828d
Husbin
以上便是本次分享的全部内容,希望对你有所帮助_
前端程序猿Pro,不止于前端,如果你也对前端开发亦或者是程序员行业感兴趣欢迎您的关注~
如果你有任何想法和疑问,欢迎留言~ 一起探讨