• 浏览器跨域方案


    很多种方法,但万变不离其宗,都是为了搞定同源策略。重用的有 jsonpiframecorsimgHTML5 postMessage等等。其中用到 html 标签进行跨域的原理就是 html 不受同源策略影响。但只是接受 Get 的请求方式,这个得清楚。

    延伸1:img iframe script 来发送跨域请求有什么优缺点?

    1. iframe

    • 优点:跨域完毕之后DOM操作和互相之间的JavaScript调用都是没有问题的
    • 缺点:1.若结果要以URL参数传递,这就意味着在结果数据量很大的时候需要分割传递,巨烦。2.还有一个是iframe本身带来的,母页面和iframe本身的交互本身就有安全性限制。

    2. script

    • 优点:可以直接返回json格式的数据,方便处理
    • 缺点:只接受GET请求方式

    3. 图片ping

    • 优点:可以访问任何url,一般用来进行点击追踪,做页面分析常用的方法
    • 缺点:不能访问响应文本,只能监听是否响应

    延伸2:配合 webpack 进行反向代理?

    webpackdevServer 选项里面提供了一个 proxy 的参数供开发人员进行反向代理

    '/api': {
      target: 'http://www.example.com', // your target host
      changeOrigin: true, // needed for virtual hosted sites
      pathRewrite: {
        '^/api': ''  // rewrite path
      }
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后再配合 http-proxy-middleware 插件对 api 请求地址进行代理

    const express = require('express');
    const proxy = require('http-proxy-middleware');
    // proxy api requests
    const exampleProxy = proxy(options); // 这里的 options 就是 webpack 里面的 proxy 选项对应的每个选项
    
    // mount `exampleProxy` in web server
    const app = express();
    app.use('/api', exampleProxy);
    app.listen(3000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后再用 nginx 把允许跨域的源地址添加到报头里面即可

    说到 nginx ,可以再谈谈 CORS 配置,大致如下

    location / {
      if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';  
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Headers' 'DNT, X-Mx-ReqToken, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type';  
        add_header 'Access-Control-Max-Age' 86400;  
        add_header 'Content-Type' 'text/plain charset=UTF-8';  
        add_header 'Content-Length' 0;  
        return 200;  
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    C# ?问号运算符
    计算机毕业设计springboot基于疫情背景下的新型点餐送餐系统bpe1s源码+系统+程序+lw文档+部署
    kafka 3.0 离线安装
    Kyligence Zen 产品体验——超好用指标平台一站式体验教程
    Flutter 中的 IconTheme 小部件:全面指南
    OpenCV图像裁剪:使用&运算符在OpenCV图像裁剪时进行边界检查
    Python灰帽编程——初识Python上篇
    RxJava入门
    Win11笔记本省电模式怎么开启?Win11电脑节电模式打开方法
    Springboot 整合Mytbatis与Mybatis-Plus
  • 原文地址:https://blog.csdn.net/php_martin/article/details/125869546