跨域造成原因和解决方法

1.跨域指?

跨域是指浏览器的不执行其他网站脚本的,由于浏览器的同源策略造成,是对JavaScript的一种安全限制

说白点理解,当你通过浏览器向其他服务器发送请求时,不是服务器不响应,而是服务器返回的结果被浏览器限制了。

 

同源策略的同源

同源指的是协议、域名、端口 都要保持一致

http://www.123.com:8080/index.html (http协议,www.123.com 域名、8080 端口 ,只要这三个有一项不一样的都是跨域,这里不一一举例子)

http://www.123.com:8080/matsh.html(不跨域)

http://www.123.com:8081/matsh.html(端口不一样,跨域)

注意:localhost 和127.0.0.1 虽然都指向本机,但也属于跨域。

 

2.跨域的解决方案

>JSONP方式,只支持GET请求,不支持POST请求。

>反向代理,ngixn

> 配置浏览器(我配置了谷歌,属性->目标> 在后面追加 --args --disable-web-security --user-data-dir  注意有个空格)。设置成功打开浏览器是出现已栏提示证明已成功配置。

>vue 项目跨域配置

Vue-cli 创建的项目,可以直接利用 Node.js 代理服务器,通过修改vue proxyTable接口实现跨域请求

proxyTable: {  
    '/api': {  //代理地址  
        target: 'http://10.1.0.34:8000/',  //需要代理的地址  
        changeOrigin: true,  //是否跨域  
        secure: false,    
        pathRewrite: {  
            '^/api': '/'   //本身的接口地址没有 '/api' 这种通用前缀,所以要rewrite,如果本身有则去掉  
        }
    }
}

api指的就是target的地址

参数proxyTable详解:

  vue-cli的config文件里的参数:proxyTable,这个参数主要是一个地址映射表,你可以通过设置将复杂的url简化,例如我们要请求的地址是api.xxxxxxxx.com/list/1,可以按照如下设置:

proxyTable: {
  '/list': {
    target: 'http://api.xxxxxxxx.com',
    pathRewrite: {
      '^/list': '/list'
    }
  }
}

这样我们在写url的时候,只用写成/list/1就可以代表api.xxxxxxxx.com/list/1.

这样实现跨域的原理是利用本地虚拟的服务器,代接受发送请求

 

 参考详细链接  https://www.cnblogs.com/goloving/p/8901189.html

 

> 后台配置请求head

header('Access-Control-Allow-Origin:*');//允许所有来源访问

header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

《完结》

 

《后续补充》==========================================================================》 最近研究node 遇到跨域的例子,下面补充点  (node服务器执行)

1.jsonp实现跨域的方式,了解,反正也不会用到了  吧

  缺点: get请求,前后端都要修改

  优点:无兼容问题(js哪个浏览器不兼容 站出来)

  思路:利用js保存全局变量来传递数据,因为js不受同源策略控制,script标签加载机制

html

    

 

 

 

js 获取变量,解析数据

    

 

 

2. cors方式

分类:简单请求和预检请求(非简单请求)

 

 原理:如图

ajax请求结果被浏览器截胡了,cors就是红色箭头,告诉浏览器这是我要的,别管闲事,然后就可以拿到数据了【笑吧笑吧 表达也就这样了】

    

 

对于跨源AJAX请求是简单请求,浏览器就自动在头信息之中,添加一个Origin字段。

GET /cors HTTP/1.1 
Origin: http://m.xin.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

这个orgin我们可以指定的,如果访问的域不是指定范围或者没有指定origin都会报错跨域问题。

譬如:Access-Control-Allow-Origin:'localhost:5000'// * 表示所有域都可以

其他的

    

 

 

 跨域报错示例

    

 

 

 

 

解决方式

1. api请求baseulr指向服务器(我这里http指定端口4000)

     

 

 

 

2. Cors设置跨域允许

 js文件中设置

 

     

 

 

 

 

结果(请求url指向也是4000端口了)

    

 

 

 

 

 

这里有个不错文章解析了cors的原理https://www.cnblogs.com/qiujianmei/p/11649905.html

 

 

 3. cookie、预检请求、代理服务器proxy解决

................

 

posted @ 2020-03-31 10:55  树叶铃铛  阅读(19415)  评论(0编辑  收藏  举报