PHP에서 여러 형태의 도메인 간 구현
1 , JSONP(패딩이 있는 JSON) 원칙
다른 도메인에서 js를 로드하려면 스크립트 src 형식을 사용하세요. 그러나 다른 도메인의 데이터는 태그를 통해 도입되므로 요청한 JSON 형식의 데이터는 js로 실행되어 처리됩니다.
따라서 연산 및 처리를 위해 반환된 데이터를 미리 패키징하고 함수로 캡슐화해야 합니다. 함수 이름은 인터페이스 매개변수를 통해 백그라운드로 전달됩니다. 백그라운드는 함수 이름을 구문 분석하고, 원본 데이터는 이 함수 이름으로 래핑되어 프런트 엔드로 전송됩니다. (JSONP를 구현하려면 해당 인터페이스의 백엔드 협조가 필요합니다.)
예:
<script>function showData(ret){ console.log(ret); }</script><script src="http://api.jirengu.com/weather.php?callback=showData"></script>
스크립트 src 요청이 백엔드에 도달한 후 백엔드는 콜백 매개변수를 구문 분석하고, 문자열 showData를 얻고, 데이터를 보낸 후 데이터를 반환하고, 이를 showData(즉, showData({"json data"}))로 캡슐화합니다. 프런트엔드 스크립트 태그가 로드됩니다. 데이터를 수신한 후 json 데이터가 showData의 매개변수로 사용되고 함수가 호출되어 실행됩니다.
2. CORS
CORS는 Cross-Origin Resource Sharing(Cross-Origin)을 나타냅니다. 리소스 공유
)는 최신 브라우저를 지원하는 ajax 도메인 간 리소스 요청 방법이며 IE는 10 이상을 지원합니다. Cross-Origin Resource Sharing
),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。
实现方式:
当使用XMLHttpRequest
发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin
,后台进行一系列处理,如果确定接受请求,则在返回结果中加入一个响应头:Access-Control-Allow-Origin
구현 방법:
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)
<!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>
postMessage
두 개의 도메인 이름이 있다고 가정합니다(기본 도메인 도메인 이름이 일치하지 않습니다) , iframe 페이지는 액세스 호출을 허용하는 것이며 postMessage를 사용하여 구현할 수 있습니다.
Principle: A 도메인 이름은 postMessage에 대한 요청을 보내고 B 도메인 이름은 메시지 이벤트를 듣고 데이터를 처리하고 반환합니다