前后端分离------解决跨域

1.为什么产生跨域问题
 
     跨域问题来源于JavaScript的同源策略
 
    即只有 协议+主机名+端口号(如存在)相同,则允许相互访问
 
    也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源
 
    跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签
 
2.什么是跨域
       
通过一个Url去访问另一个Url的过程中,如果他们的 协议、域名、端口 三者之间任意一个存在不同,则为跨域
 
3.如何解决跨域
 
    1 . 修改浏览器的设置
 
--disable-web-security--user-data-dir#找到路径下的Chrome.exe通过前面的命令对浏览器进项修改设置
 
    2.修改请求的方式: J sonp
 
$("#Test").click(function(){
    $.ajax({
        url : 'http://www.xiaozhao.top/Index/Test/crossDomain',
        data : {},
        type : 'get',
        dataType : 'jsonp',
        success : function (result) {
            alert(result);
        }
    });
});
    
缺点: Jsonp只支持GET请求
           只支持跨域HTTP请求
           可能存在很多其他的限制...
 
 
    3.CORS
        1.什么是CORS
 
          CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
协议:
  1. 传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求。            
  2. 浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本。但是Javascript脚本是不能获取这些资源的内容的,它只能被浏览器执行或渲染。
  3. 在Flash和Silverlight中,服务器需要创建一个crossdomain.xml的文件来允许跨域请求。如果这个文件声明“http://your.site”允许来自“http://my.site”的请求,则来自“http://my.site”的请求可以访问所有“http://your.site”的文件。这是一种整个站点层面上的控制模式,要么你允许一个外域的站点访问,要么拒绝。
  4. COR不一样,它是页面层次的控制模式。每一个页面需要返回一个名为‘Access-Control-Allow-Origin’的HTTP头来允许外域的站点访问。你可以仅仅暴露有限的资源和有限的外域站点访问。在COR模式中,访问控制的职责可以放到页面开发者的手中,而不是服务器管理员。当然页面开发者需要写专门的处理代码来允许被外域访问。
 
另外一个主要的区别是,某个站点的crossdomain.xml文件是最早被浏览器获取并分析的。如果一个外域的站点不允许被访问,浏览器压根就不会发出跨域请求。
COR则相反,Javascript先发出跨域请求,然后检查回复的‘Access-Control-Allow-Origin’头。如果这个头允许该外域访问,则Javascript可以读取这个回复,否则就被禁止访问。如果请求不是一个简单的COR,则向外域服务器发送预检验请求,如果回复的头部允许访问,则发送跨域请求,否则禁止。
COR的实现标准就是CORS协议。
 
        2.要求
 
            CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
 
        3.请求分类
 
             简单请求(simple request)和非简单请求(not-so-simple request)
 
        4.解决
              1.修改服务端的代码设置头信息
                  res.setHeader('Access-Control-Allow-Origin', "*"); //针对哪个域名可以访问,*表示所有
                  res.setHeader('Access-Control-Allow-Credentials', true); //是否可以携带cookie
                  res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');

              2.通过@CrossOrigin

             3.通过网关配置

 
 
        
 

猜你喜欢

转载自blog.csdn.net/weixin_43562937/article/details/106533784