ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

充分理解跨域问题并解决跨域问题

2019-07-01 15:51:45  阅读:133  来源: 互联网

标签:浏览器 跨域 script 充分 问题 ajax html 请求


  现在越来越多的项目就算是一个管理后端也偏向于使用前后端分离的部署方式去做,为了顺应时代的潮流,一前后端分离就产生了跨域问题,所以许多同学把跨域和前后端分离项目联系在了一起,其实跨域产生的原因并不是前后端分离导致的,那我们一起来看一下,希望可以靠这一篇文章解答大家所有的跨域问题

  跨域产生的条件

  使用xmlHttpRequest,即我们通常说的ajax请求

  浏览器做了这个事

  访问的域名不同,即访问的html页面是a域名下的,但内部js发送的ajax请求的目标地址却是b域名以上三个条件缺一不可,尤其是第三个条件许多做移动端的同学可能都没有听过,因为移动端爽爽的用各种http请求狂发不同的域名,但是浏览器不允许我们这么做,为了一个词安全

  如何解决跨域问题

  解决跨域问题的根本就是要打破上述的三个限制中的任何一个,我们来看一下逐个击破的方式

  JSONP方式

  jsonp是打破第一重限制,用了XMLHttpRequest就跨域,那我不用这种方式了,我们怎么做的,来看一段jquery的带jsonp的ajax请求

  

 

  

  看似用了ajax请求,其实内部完全不是那么回事,多了jsonp和jsonpCallback选项,它内部将代码翻译并把页面上的dom操作成这样

  !DOCTYPE html

  html

  head

  meta charset=utf-8

  /head

  body

  script type='text/javascript'

  // 后端返回直接执行的方法,相当于执行这个方法,由于后端把返回的数据放在方法的参数里,所以这里能拿到res。

  window.showLocation = function (res) {

  console.log(res)

  //执行ajax回调

  }

  /script

  script src='http://api.map.baidu.com/geocoder/v2/?address=上海callback=showLocation' type='text/javascript'/script

  /body

  /html

  这个时候,html页面的script src标签回去访问api.map.baidu.com的服务端,由于script,img这种标签浏览器是不受xmlhttprequest限制的,可以随意访问,这个时候对应的后端代码取得address参数,最后根据双方约定好的callback参数,返回一个被包装后的json,即

  

 

  然后浏览器直接执行了对应的这个showLocation()… 等等,这个不就相当于执行了我们上面定义的window.showLocation方法并且传入了我们需要的json返回吗,那我们的ajax success方法里就可以得到这个返回类型了,并且没有跨域,是不是很精妙。

  CORS

  CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)跨域资源共享 CORS 详解。这个玩样用于“破解”掉浏览器的限制,说是破解其实也是浏览器认识到了一些头部就放行了的意思,需要在http的response内多设置几个头部

  Access-Control-Allow-Origin:* 表明允许所有的origin(浏览器的html页面路径)访问,而并非是同源的origin

  Access-Control-Request-Method:* 表明允许所有的http request头,访问,因为浏览器在触发如下几个场景会在发送真正的数据前发送options这样的预检请求检测,一旦预检通过后才会发送真正的get或post数据请求,这个时候我们按照cors的设置就需要允许对应的method访问,触发的几种情况包括

  1:请求的方法不是GET/HEAD/POST

  2:POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

  3:请求设置了自定义的header字段等

  Access-Control-Allow-Headers:* 设置所有header均可以被允许,这个配置联通上述的request method options检测一起使用,可以在需要自定义header的场景下使用

  Access-Control-Allow-Credentials:true 这个参数只有当需要跨域使用cookie传递时才需要设置为true,并且需要前端ajax配置使用xhrField:{withCredential:true}时才能传递cookie,另外safari和最新版本的chrome浏览器还需要在设置内放开对应限制,可参考我的秒杀课程,当这个参数被设置成true时候Access-Control-Allow-Origin就不能设置为*,否则就变成任何origin域都能允许传递cookie了,可将其调整为前端origin字段传什么我就用什么若你使用的是nginx反向代理,则可以直接在nginx反向代理上配置

  

 

  代理法

  打破不同源的限制,我只要让它同源就可以了,比如要我的静态页面是http://a.com/index.html动态ajax请求访问的是http://b.com/api/***

  我只需要将对应的服务部署在不同的机器上,然后使用一个公共的c.com的域名作为nginx反向代理的入口域名,在将静态服务和动态服务分别挂在后面的被代理局域网服务器内,修改配置

  

 

  

标签:浏览器,跨域,script,充分,问题,ajax,html,请求
来源: https://blog.csdn.net/qianfeng_dashuju/article/details/94393590

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有