• 跨域问题的解决方案和实现原理


    浏览器本身的特点
    http 默认端口号 80
    https 默认端口号 443
    当 WEB服务器 和 数据服务器 不是同一台服务器,则会报 ‘服务器不允许当前源访问’

    跨域问题的产生及其价值意义
    1.JSONP跨域解决方案的底层原理

    客户端:

    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script>
      $.ajax({
        url: "http://127.0.0.1:8001/list",
        method: "get",
        dataType: "jsonp",
        success: (res) => {
          console.log(res);
        },
      });
    </script>

    服务端:

    let express = require("express");
    let app = express();
    app.listen(8001, (_) => {
      console.log("OK!");
    });
    app.get("/list", (req, res) => {
      let { callback = Function.prototype } = req.query;
      let data = {
        code: 0,
        message: "测试",
      };
      res.send(`${callback}(${JSON.stringify(data)})`);
    });

    2.基于 iframe的跨域解决方案
    window.name
    document.domin
    location.hash
    post message

    3.CORS跨域资源共享

    客户端

    import axios from "axios";
    import qs from "qs";
    axios.defaults.baseURL = "http://127.0.0.1:3000";
    axios.defaults.timeout = 10000;
    axios.defaults.withCredentials = true;
    
    /**
     * 设置请求传递数据的格式(看服务器要求什么格式)
     * x-www-form-urlencoded
     */
    axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded";
    axios.defaults.transformRequest = (data) => qs.stringify(data);
    
    /**
     * 设置请求拦截器
     */
    axios.interceptors.request.use(
      (config) => {
        let token = localStorage.getItem("token");
        token && (config.headers.Authorization = token);
        return config;
      },
      (error) => {
        return Promise.reject(error);
      }
    );
    
    /**
     * 响应拦截器
     */
    axios.interceptors.response.use(
      (response) => {
        return response.data;
      },
      (error) => {}
    );

    服务端

    app.use((req, res, next) => {
      res.header("Access-Control-Allow-Origin", "");
      res.header("Access-Control-Allow-Credentials", true);
      res.header(
        "Access-Control-Allow-Headers",
        "PUT,POST,GET,DELETE,OPTIONS,HEAD"
      );
      res.header(
        "Access-Control-Allow-Methods",
        "Content-Type,Content-Length,Authorization,Accept,X-Requested-With"
      );
      req.method === "OPTIONS"
        ? res.send("CURRENT SERVICES SUPPORT CROSS DOMAIN REQUESTS!")
        : next();
    });

    4.基于 http proxy 实现跨域请求
    nginx反向代理

  • 相关阅读:
    spark性能调优 数据倾斜 内存不足 oom解决办法
    python2的中文编码
    spark UDF函数
    spark cache table
    spark 创建稀疏向量和矩阵
    mysql 分组排序
    给pyspark 设置新的环境
    CF662C Binary Table
    bzoj 4310 跳蚤
    3.29省选模拟赛 除法与取模 dp+组合计数
  • 原文地址:https://www.cnblogs.com/crazycode2/p/13458521.html
Copyright © 2020-2023  润新知