您好,欢迎访问一九零五行业门户网

php跨域的几种方式

php实现跨域的几种形式
1、jsonp(json with padding)原理
利用html里面script标签可以加载其他域下的js这一特性,使用script src的形式来获取其他域下的数据,但是,因为是通过标签引入的,所以,会将请求到的json格式的数据作为js去运行处理,显然这样运行是不行的。
因此,就需要提前将返回的数据包装一下,封装成函数进行运行处理,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上包裹这个函数名,发送给前端。(jsonp 需要对应接口的后端的配合才能实现)
实例:
<script>function showdata(ret){console.log(ret);}</script><script src="http://api.jirengu.com/weather.php?callback=showdata"></script>
当script src请求到达后端后,后端会去解析callback这个参数,获取到字符串showdata,在发送数据后端返回数据,用showdata封装一下,即showdata({"json数据"}) ,前端script标签在加载数据后,会把json数据作为showdata的参数,调用函数运行。
2、cors
cors全称是跨域资源共享(cross-origin resource sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,ie支持10以上。
实现方式:
当使用xmlhttprequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:origin,后台进行一系列处理,如果确定接受请求,则在返回结果中加入一个响应头:access-control-allow-origin;浏览器判断该相应头中,是否包含origin的值,如果有,则浏览器会处理响应,我们就可以拿到响应数据,如果不包含,浏览器直接驳回,这时,我们无法拿到响应数据。
实例:
server.js
var http = require('http')var fs = require('fs')var path = require('path')var url = require('url')http.createserver(function(req, res){var pathobj = url.parse(req.url, true) switch (pathobj.pathname) { case '/getnews': var news = [ "第11日前瞻:中国冲击4金 博尔特再战200米羽球", "正直播柴飚/洪炜出战 男双力争会师决赛", "女排将死磕巴西!郎平安排男陪练模仿对方核心" ] res.setheader('access-control-allow-origin','http://localhost:8080') //res.setheader('access-control-allow-origin','*') res.end(json.stringify(news)) break; default: fs.readfile(path.join(__dirname, pathobj.pathname), function(e, data){ if(e){ res.writehead(404, 'not found') res.end('<h1>404 not found</h1>') }else{ res.end(data) } }) }}).listen(8080)
index.html
<!doctype html><html><body> <div class="container"> <ul class="news"></ul> <button class="show">show news</button> </div><script> $('.show').addeventlistener('click', function(){ var xhr = new xmlhttprequest() xhr.open('get', 'http://127.0.0.1:8080/getnews', true) xhr.send() xhr.onload = function(){ appendhtml(json.parse(xhr.responsetext)) } }) function appendhtml(news){ var html = '' for( var i=0; i<news.length; i++){ html += '<li>' + news[i] + '</li>' } $('.news').innerhtml = html } function $(selector){ return document.queryselector(selector) } </script> </html>
3、postmessage
假设有两个域名(主域域名不一致),其中iframe页面是允许访问调用,那么就可以用postmessage实现。
原理:a域名发送请求postmessage,b域名间听到了message事件,就处理并返回数据
//b域名<script>window.frames[0].postmessage(this.value, '*');//*号表示在任何域下都可以接收messagewindow.addeventlistener('message', function(e){ console.log(e.data);});</script>
以上内容仅供参考!
推荐教程:php视频教程
以上就是php跨域的几种方式的详细内容。
其它类似信息

推荐信息