• 技术文章 >后端开发 >php教程

    php跨域的几种方式

    VV2019-10-09 17:22:07原创2323

    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, '*');
    //*号表示在任何域下都可以接收message
    window.addEventListener('message', function(e){
      console.log(e.data);
    });</script>

    以上内容仅供参考!

    推荐教程:PHP视频教程

    以上就是php跨域的几种方式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:PHP 跨域
    上一篇:PHP 错误与异常的日志记录 下一篇:PHP 反射之动态代理
    大前端线上培训班

    相关文章推荐

    • php解决跨域问题• php怎么解决跨域• PHP设置多域名允许跨域访问• php如何破解禁止跨域访问

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网