1.什么是跨域?

  a.test.com 和 b.test.com 是两个不同的域,而处于安全机制考虑,JS只能访问与所在页面同一个域(相同协议、域名、端口)的内容,但是我们在项目开发时,经常遇到一个页面的js代码,需要去访问另一个服务器上的接口,包括GET,POST,PUT等不同形式请求,这就出现了跨域问题。

2.解决跨域的几种方法。

  通过实际项目中涉及到的和网上看到别人用过的,总结一下大概有以下几种方法:

  1). document.domain

    在主域相同的时候才能使用。

  2). iframe

    这种方式已经很少见到了,很不优雅,很难控制。

  3). JSONP

    这种方式应该是有一定的能力处理跨域请求的,但是缺点也十分明显,因为原理是动态创建script标签,通过回调来获取数据,那么就是说它只能处理GET请求。而且对于请求失败的error处理也不好。

  4). web socket

    H5 新增加的一种浏览器的API。只有在支持web socket协议的服务器上才能正常工作。

  var url='ws://www.baidu.com';  //http->ws; https->wss 

  if ("WebSocket" in window) {
    console.log("WebSocket works...");
    var ws = new WebSocket(url);
    ws.onopen = function() {
      // Web Socket is connected, send data using send()
      var msg = '{"key": "test","group": "A"}';
      ws.send(msg);
      console.log("Request to open a connection... Message sent...");

    };
    ws.onmessage = function(evt) {
      var data = evt.data;
      // console.log("Message received, and it's...");
      console.log(data);
    };
    ws.onclose = function(e) {
      // websocket is closed.
      console.log("Connection is closed...");
      //console.log(e);
      connect();
    };
    ws.onerror = function(e){
      // websocket is error.
      console.log("Connection is error...");
      //console.log(e);
    }
  } else {
    // The browser doesn't support WebSocket
    console.warn("WebSocket NOT supported by your Browser...");
  }

  5).CORS

    这么多解决方法中目前最方便有效的就是这种,CORS。

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing),它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源的限制。

  6).在开发中经常用来解决本地跨域的一种方法是配置nginx,再转发到线上或者测试服务器。不知道这种算不算一种方法。

   http {

    server {         

      listen          80;         

      server_name      w.dev.test.com w.test.com;         

       location ~ ^/(api|action|avatar|financing|files)/{

        if ($host = "w.test.com"){

          proxy_pass "https://www.test.com";

        }

        if ($host = "w.dev.test.com"){

          proxy_pass "http://dev.test.com";

        }

      }

      location /{ ... }

    }

  }

3.CORS 详解:

  CORS实现起来很简单,但是需要浏览器和服务器同时支持,也就是说服务器需要配置允许你跨域请求,浏览器也需要支持你能够跨域去请求资源。目前大部分浏览器都能够支持。

  1). 服务器端配置:

    Access-Control-Allow-Origin: <origin> | * // 授权的源控制

    Access-Control-Max-Age: <delta-seconds> // 授权的时间

    Access-Control-Allow-Credentials: true | false // 控制是否开启与Ajax的Cookie提交方式

    Access-Control-Allow-Methods: <method>[, <method>]* // 允许请求的HTTP Method

    Access-Control-Allow-Headers: <field-name>[, <field-name>]* // 控制哪些header能发送真正的请求

    

    response headers中与CORS请求相关的字段,都以Access-Control-开头。

    (1)Access-Control-Allow-Origin 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

    (2)Access-Control-Allow-Credentials 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

    (3)Access-Control-Allow-Headers 如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段。

    (4)Access-Control-Allow-Methods 该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。测试中发现,如果浏览器请求中没有Access-Control-Request-Method字段,此字段可不设置。

    (5)Access-Control-Max-Age 该字段可选,用来指定本次预检请求的有效期,单位为秒。

  ***需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

  2). 前端

  如果前端不做任何特殊设置,正常请求跨域的域名接口是可以的,但是只能是GET,且不带有cookie。

  如果想要在request headers中带有cookie就要进行特殊的设置。

  jQuery:

    $.ajax("www.cros.com/api/data", {

      type: "GET",

      xhrFields: {

        withCredentials: true

      },

      success: function(data, status, xhr) {}

    });

  angularJs:

    $http.post(url, {withCredentials: true, ...})

    // 或者

    $http({withCredentials: true, ...}).post(...)

    // 或者

    .config(function ($httpProvider) {

      $httpProvider.defaults.withCredentials = true;

    }

  经过测试法相,jQuery中无论是GET请求还是POST请求,在请求头中是不会加上Access-Control-Request-Headers字段的,也就是说这样jQuery不需要服务器设置Access-Control-Allow-Headers。可以看到只有Host显示是跨域请求,其他的和同域没什么区别。

但是在angularJs中是不一样的,GET请求基本差不多

但是POST请求是会加上 Access-Control-Allow-Methods和Access-Control-Allow-Headers。

这时如果服务器没有设置Access-Control-Allow-Headers,就会请求失败。

参考:http://www.cnblogs.com/JChen666/p/3399951.html

   http://www.ruanyifeng.com/blog/2016/04/cors.html

     https://my.oschina.net/blogshi/blog/303758

转载于:https://www.cnblogs.com/isnan/p/6101294.html

CORS-跨域资源共享 解决跨域问题相关推荐

  1. Python 使用CORS跨域资源共享解决flask服务器跨域问题、浏览器同源策略

    CORS 全称 Cross-origin resource sharing(跨域资源共享),只要服务端配置了 CORS,前端调用时就可以实现跨域访问了. 形式就是封装在 header 里的一些参数,例 ...

  2. 什么是跨域(CORS)?怎么解决跨域(CORS)?

    什么是跨域(CORS)? 跨域是指浏览器不能执行其他网站上的脚本,它是由浏览器的同源策略造成的,是浏览器对 JS 的安全限制.是浏览器从一个域名网页请求另一个域名资源时,出现端口.域名.协议任一不同, ...

  3. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

    近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...

  4. 什么是跨域及解决跨域都有哪些方法?

    一.同源策略 浏览器为了隔离潜在的恶意文件,使用同源策略,限制从一个源加载的文档或脚本和另一个源的资源进行交互(不同源之间的文档,资源的交互); 通俗的理解:浏览器规定,A 网站的 JavaScrip ...

  5. java 跨域_springboot解决跨域CROS问题,用注解@CrossOrigin

    项目是springboot框架,前后端分离,需要跨域,当前前端可以用JSONP解决,但是java端如何解决呢? 因为是springboot框架,所以好多都可以用注解解决问题,所以就用到了@CrossO ...

  6. apache vue跨域_vue解决跨域问题

    开发模式 要知道,跨域这个行为是浏览器禁止的,但是服务端并不禁止.使用proxyTable的原理就是将域名发送给本地的服务器,再由本地的服务器去请求真正的服务器. 打开config/index.js, ...

  7. ajax与微服务,微服务 - 如何解决跨域

    什么是跨域问题? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制. 什么是同源? 所谓同源是指,域名,协议,端口均相同 htt ...

  8. Nginx 方向代理解决跨域问题-2

    概述 在浏览器端进行 Ajax 请求时会出现跨域问题,那么什么是跨域,如何解决跨域呢?先看浏览器端出现跨域问题的现象,如下图所示 什么是跨域问题? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览 ...

  9. 解决跨域请求的四种方法

    跨域 跨域就是请求的url中的"协议"."域名"."端口号"其中任何一种不一样都是属于跨域.解决跨域的主要的四种方法是jsonp.跨域资源共 ...

最新文章

  1. 百度燎原计划2018强势回归 开放深度学习工程师评价标准
  2. 2021年春季学期-信号与系统-第十四次作业参考答案-第五小题参考答案
  3. SpringMVC的请求-获得请求参数-自定义类型转换器
  4. 曹大:我的快速阅读法
  5. ASP.NET Core 中的那些认证中间件及一些重要知识点
  6. 如何获取投票提交地址_简单实用 | 2019全国医院擂台赛投票攻略(县域版)
  7. MySQL replace into (insert into 的增强版)
  8. kvm虚拟机块对齐问题研究
  9. wpf 导航按钮去掉_高德地图推出个性导航,你的私人订制导航是什么样的?
  10. html酒店管理模板,酒店管理系统流程图模板分享及绘制技巧
  11. CoreUI: RunTimeThemeRefForBundleIdentifierAndName() couldn't find Assets.car in bundle...
  12. Client network socket disconnected before secure TLS connection was establishedView in Conso
  13. 如何像“二次元萌妹”小冰一样写诗创作和即兴编曲?
  14. lintcode 983. 棒球游戏
  15. 微信报餐小程序,食堂报餐统计,微信订餐小程序点餐公司订餐微信小程序源码开发
  16. ctfshow web78-web81文件包含漏洞 wp
  17. 依照ILSVRC2012在matconvnet-1.0-beta23 中用imagenet训练的情况,训练自己的数据
  18. 电脑能正常上网百度,但是网络显示无Internet
  19. 获取手机相册中照片的地址,保存在手机中的URL(Swift 代码)
  20. position四个属性详解

热门文章

  1. 文字转语音(jacob)
  2. 2022-2028年中国氟橡胶预混胶行业市场行情监测及未来前景规划报告
  3. 2022-2028年中国PGA树脂行业全景调研及投资前景展望报
  4. C++ 笔记(26)— 主函数 main(int argc, char *argv[]) 参数说明
  5. Flask学习之路(一)--初识flask
  6. 论文阅读工具ReadPaper
  7. 芯片初创公司一亿融资可以烧多久
  8. 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
  9. 端到端TVM编译器(上)
  10. 2021年大数据Hadoop(十四):HDFS的高可用机制