接口跨域----动态获取端口、协议、域名

356 阅读1分钟
  • window.location.href 网页完整的url
  • location.href: 完整的 URL
  • location.protocol: 协议
  • location.hostname: 主机名
  • location.host: 主机名加端口号
  • location.port: 端口号
  • location.pathname: 当前 URL 的路径部分
  • location.search:从问号 (?) 开始的 URL(查询部分)
  • location.hash: 从井号 (#) 开始的 URL(锚)

1162201-20210203135836184-692701074.jpg

跨域条件: 当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”。

注意:跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。

  // 上传图片
  $('#file').localResizeIMG({
    width: 960,
    quality: 0.8,
    success: function (result) {
      if (result.file.size / 1024 / 1024 > 4) {
        JC.notice("只能上传不大于4M的图片", 'info');
        return false
      }
      var img = new Image();
      img.src = result.base64;
      $('.imgBase64Name').val(result.file.name);
      var xhr = new XMLHttpRequest();
      $(".imgBase64").val(result.base64.replace(/\+/g, '%2B'));
      //当前页面域名为bbb域名 接口为aaa域名 导致跨域
      var formUrl = 'https://xxx域名/upload/upload?proxyPage=' + document.location.protocol + '//' + location.host +'/uploadCallback.aspx?callback';
      $('#form-upload').attr('action', formUrl);
      $("#form-upload").submit();
      JC.notice("正在上传");
      return;
    }
  })

跨域原因:项目需求能够上传图片,后端接口将base64格式图片转成url,由于存储的图片资源与当前页面的域名不一致--导致跨域了。

解决方案: 接口的请求地址通过动态获取当前页面的协议+域名组合 从而解决同源策略及其限制

路过点个赞 让我们一起 变得更强

传送门: 移动端指定标签截图 生成png格式兼容iOS和Android