跨域--浏览器与服务器通信过程中出现跨域问题

一、跨域产生的原因

浏览器和服务器协议、域名、端口号****只要有一个不一致,就会产生跨域错误。

服务器和服务器进行数据通信时,如果三要素不一致,也不会产生跨域错误。

跨域的限制是浏览器的限制,与服务器无关。

跨域是一个安全策略。

跨域产生时,请求已经发送到了服务器,并且服务器也对此次请求做出来相应,只是浏览器不认此次响应。

示例:

客户端:http://www.baidu.com

服务端:http://www.baike.baidu.com(跨域)

https://www.baidu.com(跨域)

http://www.baidu.com:8080(跨域)

http://www.baidu.com:80不跨域,浏览器默认端口号为80,可省略

二、跨域的解决方案

1、后端解决CORS

后端配置响应头,无需前端配置。

2、运维解决nginx

微云配置nginx,无需前端配置。

3、前端解决--jsonp

现在已经不用了,只支持get请求,原理是使用html中不受同源策略限制的标签来发起请求(script)。不受同源策略限制的标签:script、link、img。

4、前端解决--webpack

webpack是工程化环境跨域问题的解决方案。缺点是只能解决开发环境的跨域问题,上线后,仍需依赖后端或运维解决跨域问题。只能解决开发环境跨域的原因是:上线后就不存在webpack了。

三、配置webpack解决跨域问题

webpack中文官网

通过在vue.config.js中配置devServer,启动代理服务器,从而解决开发环境的跨域问题。

示例代码如下:

javascript 复制代码
module.exports = {
  ...
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    // 代理选项
    // 可以有多个代理选项
    proxy: {
      // key表示如果一旦请求地址和它吻合 ,就会触发代理,代理的信息 在对象 value
      '/api': {
        target: 'http://localhost:3000', // 要代理的目标地址
        changeOrigin: true // 是否跨域
        // localhost:8888/api/user => 触发代理 =>
        //  http://www.baidu.com/user  想要这种
        //  http://www.baidu.com/api/user  下面是目前的
        // pathRewrite: {
        //   '^/api': '' // 相当于将跨域代理之后的地址进行再次替换 就可以将 /api去掉
        // }
      }
    }
    // before: require('./mock/mock-server.js')
  },
}

配置完proxy,相当于webpack已经给启动了一个代理服务器,并且这个服务器的三要素和本地启动的网站的三要素是一致的。

假设网站的地址是http://localhost:8088,那么代理服务器的三要素也是http://localhost:8088

代理服务器默认是不会转发和相应请求的,必须要通过配置告诉代理服务器,哪些请求是需要他帮忙转发的。

javascript 复制代码
proxy: {
    '键': {
        target: '目标服务器的路径'
    }
}

**'键':**表示当我请求的接口中含有这个路径,proxy就可以帮我转发该请求。

**target:**target后面的值,是告诉代理服务器,要转发到哪个目标服务器。

执行过程: 当代理服务器转发请求时,会把原路径之前的路径替换成target对应的值,替换之后,再转发请求。

**设置代理服务器的原理:**服务器与服务器之间发送数据请求,即使三要素不同,也不会产生跨域问题。

相关推荐
J_liaty16 小时前
Java实现PDF添加水印的完整方案(支持灵活配置、平铺、多页策略)
java·开发语言·pdf
PPPPPaPeR.16 小时前
从零实现一个简易 Shell:理解 Linux 进程与命令执行
linux·开发语言·c++
Yorlen_Zhang16 小时前
python Tkinter Frame 深度解析与实战指南
开发语言·python
Emma_Maria16 小时前
本地项目html和jquery,访问地址报跨域解决
前端·html·jquery
lly20240616 小时前
Eclipse 关闭项目详解
开发语言
奋斗吧程序媛16 小时前
常用且好用的命令
前端·编辑器
LXS_35716 小时前
C++常用容器(下)---stack、queue、list、set、map
开发语言·c++·学习方法·改行学it
愚者游世16 小时前
list Initialization各版本异同
开发语言·c++·学习·程序人生·算法
2301_7965125216 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Lazyload 懒加载(懒加载的图片)
前端·javascript·react native·react.js·ecmascript·harmonyos
敲敲了个代码16 小时前
从N倍人力到1次修改:Vite Plugin Modular 如何拯救多产品前端维护困境
前端·javascript·面试·职场和发展·typescript·vite