前端开发解决跨域4种方案

一、什么是跨域?

      跨域是浏览器不能执行其它网站的一些资源,如js、图片、dom、视频、音频等cookie、 local storage 和index Db无法读取 、Ajax 请求无法发送等,受浏览器同源策略的影响,只要协议、域名、端口号三个中有任意一个不一样就是跨域。

二、解决方案

1、JSONP方案

利用浏览器对<script>标签没有跨域限制,通过src属性发送带有回调函数参数的get请求,在 callback函数中前端拿到函数返回数据。

<script>

    let script = document.createElement('script');

    script.type = 'text/javascript';

    script.src = 'http://www.domain2.com:8080/login?user=admin&callback=handleCallback';

    document.head.appendChild(script);

    function handleCallback(res) {

        alert(JSON.stringify(res));

}

</script>

只能发送get请求


2、跨域资源共享CORS cross-origin resource sharing 允许浏览器相框原服务器发出XMLHttpRequest请求

在vue中通过vue-cli进行配置,在本地开发环境的请情况下,在vue.config.js中的devServer对象中添加headers: { "Access-Control-Allow-Origin": "*"},这个表示 向所有请求的herder中添加Access-Control-Allow-Origin  为*则表示接受任意域名的请求 这里后端也需要配置,接收到这个配置项后后端处理。

3、nginx反向代理接口跨域

通过监听端口服务,利用proxy_pass进行反向代理

#proxy服务器

server {

    listen      81;

    server_name  exname;#这里随便写

    location / { 

        proxy_pass  http://www.xxxx.com:8080;  #反向代理

        index  index.html index.htm;

    }

}

4、使用nodejs中间件代理跨域

在vue项目的开发环境中,配置vue.config.js

module.exports = {

    entry: {},

    module: {},

    ...

 devServer: {

    port: port,

    open: true,

    overlay: {

      warnings: false,

      errors: true

    },

    // 代理选项

    // 可以有多个代理选项

    proxy: {

      // key表示如果一旦请求地址和它吻合 ,就会触发代理,代理的信息 在对象 value

      // localhost:8888/api/user  => http://ihrm-java.itheima.net/api/user  这是我们需要的地址

      // localhost:8888/api/user  => http://ihrm-java.itheima.net/user

      '/api': {

        target: 'http://ihrm-java.itheima.net/', // 要代理的目标地址

        // target: 'http://127.0.0.1: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')

  },

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容