vue解决开发跨域、生产跨域的解决思路_(面试八股文)

目录

一、形成跨域的原因 

 二、跨域的解决方案

生产跨域

开发跨域


一、形成跨域的原因 

跨域是违背了浏览器的一种同源策略,简单来说就是浏览器一种自我保护机制

http    -    localhost   -     8080

协议   -       域名        -     端口号

只要我们的协议、端口号、域名有一个不同就会形成跨域

我们的请求发送出去,服务器接收到了这次请求,并且把响应发送给我们的本地,但是浏览器检测到了跨域,就被浏览器拦截不会给到本地,我们也就接受不到响应了。


 二、跨域的解决方案

生产跨域

  • jsonp解决跨域

主要利用script标签同源策略的漏洞,来实现跨域的,

script的src上写我们要跨域的地址,前端通过callback声明好一个函数,后端返回执行函数。执行函数参数中携带所需的数据,这个函数需要前后端去协商处理

我们可以引入一个vue-jsonp的插件来动态创建Script,动态拼接url,进而抓取数据,实现跨域,但是jsonp只能发起get请求

  • cors 配置跨域

ORS(Cross-Origin Resource Sharing)是一个W3C标准,全称“跨域资源共享”

主要后端在请求头中进行配置

"Access-Control-Allow-Origin", "开启全部允许" 来解决跨域

  • nginx配置反向代理服务器

nginx主要是通过检测url前缀,把http请求转发给后端真实物理服务器,在通过rewrite去掉前缀

开发跨域

  • 通过vue_cli 配置代理服务器

我们可以通过在vue.config.js中进行配置

devServer:{

        proxy:'请求路径'

}

去开启一个代理服务器

方法一:

module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,
  devServer: {
        proxy:'http://localhost:5000'
    }
  }
})

缺点:

这种方式只能配置一个代理,也就是只能给5000发请求,

也不能灵活的去配置走不走代理,优先匹配前端资源,比如说我们本地的public文件夹下有一个text文件,

那我们去请求'http://localhost:5000/text'的话就只会从本地读取,而不会去请求服务器

方式二:

同样是在vue.config.js中进行配置如下

module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,
  devServer: {
    proxy: {
      '/ips': {
        target: 'http://www-wms-java.itshmily.net', // 接口地址
        pathRewRite:{'^/ips':''}                   // 路径重写
        changeOrigin: true,                        // 用于控制请求头中的host值
      },
     '/aps': {
        target: 'http://www-wms-java.itshmily.net', // 接口地址
        pathRewRite:{'^/aps':''}                   // 路径重写
        changeOrigin: true,                        // 用于控制请求头中的host值
      },
    }
  }
})
  • ' / ips ':

请求的前缀(紧跟端口号),当我们请求的路径中有这个字段名的时候,vue就会检测到,并且发送在其中配置的代理。

但是注意

他会把你这个字段名也发送给服务器,例如我配置了/ips这个字段,请求text这个资源,

在上方代码中,我发送的请求地址实际上是' http://www-wms-java.itshmily.net/ips/text '

如果你后端给你的接口本身就带这个ips那么ok没有问题,

但是如果后端给你的接口是' http://www-wms-java.itshmily.net/text ',那么就会请求出错

所以我们需要配置pathRewRite进行路径重写

  • target

请求的接口地址,直接写你要代理的服务器地址就可以,一般写基地址

  • pathRewRite

路径重写,会匹配你写的正则,比如我上方代码请求的是' / ips ',

就会把我这个/ips 替换成 ' ' 空字符串

这样请求的地址就是和接口相匹配的地址 ' http://www-wms-java.itshmily.net/text '

  • changeOrigin

用于控制请求头中的host值,在vue中默认是true

比如我本地是8080,去请求端口号5050的地址

如果我配置false的话,相当于本地说真话,就是如实回答告诉服务器我来自本地host是localhost:8080

如果我配置是ture的话,就相当于我撒谎了,欺骗服务器,服务器的端口是多少我就是多少,

相当于服务器收到我来自本地host是localhost:5050

一般如果后端做了限制,所有来源不是5050的就不给你返回资源,我们就将其可以设置为true

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值