最新消息:前端博客、web前端博客、Angularjs、javascript、jQuery、HTML5、CSS3

http到https跨域请求之jsonp

JavaScript AZ 3666浏览 0评论

大家都知道,由于浏览器安全策略,使用ajax或是javascript非同源请求会被拒绝报错。一般这些解决方法会用JSONP,Proxy,CORS, Cookie 同源策略,Flash/SilverLight跨域

下面来了解这几解方法:

1、JSONP

JSONP就是利用<script>标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。其中callback函数本地文档的JavaScript函数,服务器端动态生成的脚本会产生数据,并在代码中以产生的数据为参数调用callback函数。当这段脚本加载到本地文档时,callback函数就被调用。

2、Proxy

使用代理方式跨域更加直接,因为SOP的限制是浏览器实现的。如果请求不是从浏览器发起的,就不存在跨域问题了。使用本方法跨域步骤如下:

1) 把访问其它域的请求替换为本域的请求

2)本域的请求是服务器端的动态脚本负责转发实际的请求

3)各种服务器的Reverse Proxy功能都可以非常方便的实现请求的转发,如Apache httpd + mod_proxy。

3、CORS

通过在HTTP Header中加入扩展字段Access-Control-Allow-Origin,服务器在相应网页头部加入字段表示允许访问的domain和HTTP method,客户端检查自己的域是否在允许列表中,决定是否处理响应。响应中HTTP头中的Access-Control-Allow-Origin包含Origin域,多个域名之间用逗号分隔,表示对所示域名提供跨域访问权,”*”表示允许所有域名的跨域访问;

示:Access-Control-Allow-Origin: tuterm.com

4、 Cookie 同源策略

Cookie中的同源只关注域名,忽略协议和端口。所以https://localhost:8080/和https://localhost:8081/的Cookie是共享的。

5、Flash/SilverLight

浏览器的各种插件也存在跨域需求。通常是通过在服务器配置crossdomain.xml,设置本服务允许哪些域名的跨域访问。    客户端会首先请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。 通常crossdomain.xml放置在网站根目录。

 <?xml version="1.0"?>
      <!DOCTYPE cross-domain-policy SYSTEM "https://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
      <cross-domain-policy>
      <allow-access-from domain="*"/>
      <allow-http-request-headers-from domain="*" headers="*"/>
    </cross-domain-policy>

那些问题来了,如果用jsonp时,网站启用了https,那么这问题还是没办法解决。由于https的安全性更高,它不允许http这样的脚本请求。这时可借助后端语言php,net,java等可轻松实现。

下面以php为例:

http时:
var url = 'https://lady.tuterm.com/?callback=xxx';
$.getJSON(url,function(data){
   console.info(data);  
}); 
https时:
var data = <?php echo file_get_contents('https://www.tuterm.qq.com/?callback=xxx') ?>;
console.info(data); 

或是您有更好的方法,请告诉我一声!!

转载请注明:TUTERM.COM » http到https跨域请求之jsonp

如果您觉得本文的内容对您的学习有所帮助,您可以支付宝(左)或微信(右):
alipay weichat

您必须 登录 才能发表评论!