跨域原理及解决而思路

产生跨域问题的3个原因:

1.浏览器的限制(后端服务器没有限制)

2.发出的请求不是本域的(协议,域名,端口任何一个不同都是跨域)

3.发出的是XHR(XMLHttpRequest)请求

例如用<img src="xxxxurl" />的方式访问一个不同域的地址不会出错,因为不是XHR请求

 

针对上面的3个原因有以下解决方案:

针对1的解决方案:对浏览器指定参数,让浏览器不进行校验就可以了。但这种方法需要每个用户修改浏览器配置,一般不用

针对2的解决方案:方法1:被调用方修改配置,允许跨域。方法2:调用方修改配置,隐藏跨域。

针对3的解决方案:例如使用img的src或jsonp

 

jsonp:是一个json的补充使用方式,使用script标签请求资源实现跨域。是一种变通的跨域方案

jsonp跨域使用的是动态的script标签,返回的是js代码。例如服务器返回的js代码:exit($callback."($json)");

 

解决跨域问题:

方法1:被调用方解决(在响应头自增字段,告诉浏览器允许跨域访问)

跨域请求的头部信息里面有一个Origin字段值为当前域名信息,当请求结束后浏览器会在响应头查找被访问服务器是否允许跨域的字段信息,如果没有就报错。该字段是Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Headers等。一般的简单请求访问设置Access-Control-Allow-Methods,Access-Control-Allow-Origin即可。但有些非一般的请求(发送真真数据前先发一个预检测命令,验证通过后再发真正的数据),在发送数据前要先发送预检命令,如果通过后才能继续正常把数据发送给被访问服务器,需要在被访问服务器设置Access-Control-Headers,还可以通过设置Access-Control-Max-Age设置预检命令的有效期。

当Access-Control-Allow-Origin设置为*的时候不支持带cookie(被调用方的cookie)的跨域请求。需要设置为调用服务器的地址。

如果有特殊要求,还可以实现带自定义头信息的跨域访问

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章