document.domainметод
Обратите внимание, что это метод iframe, который устанавливает значение document.domain в суффикс текущего домена. Если это так, более короткий домен используется для последующих проверок происхождения. Например, предположим, что скрипт в документе at http://store.company.com/dir/other.htmlвыполняет следующий оператор:
document.domain = "company.com";
После выполнения этого оператора страница пройдет проверку источника с http://company.com/dir/page.html. Однако, по тем же соображениям, company.com не мог установить document.domain в othercompany.com.
С помощью этого метода вам будет разрешено извлекать javascript из iframe, созданного на поддомене, на странице, созданной в основном домене. Этот метод не подходит для междоменных ресурсов, так как браузеры, такие как Firefox, не позволят вам перейти на document.domainполностью чужой домен.
Источник: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Метод совместного использования ресурсов из разных источников
Обмен ресурсами между источниками (CORS) - это рабочий проект W3C, который определяет, как браузер и сервер должны взаимодействовать при доступе к источникам из разных источников. Основная идея CORS состоит в том, чтобы использовать настраиваемые заголовки HTTP, чтобы браузер и сервер знали достаточно друг о друге, чтобы определить, будет ли запрос или ответ успешным или нет.
Для простого запроса, который использует либо GETили POSTбез каких - либо специальных заголовков и чье тело text/plain, запрос посылается с дополнительным заголовком называется Origin. Заголовок Origin содержит источник (протокол, имя домена и порт) запрашивающей страницы, чтобы сервер мог легко определить, должен ли он обслуживать ответ. OriginЗаголовок примера может выглядеть так:
Origin: http://www.stackoverflow.com
Если сервер решает, что запрос должен быть разрешен, он отправляет Access-Control-Allow-Originзаголовок, отражающий тот же источник, который был отправлен, или, *если это общедоступный ресурс. Например:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Если этот заголовок отсутствует или происхождение не совпадает, браузер отклоняет запрос. Если все хорошо, то браузер обрабатывает запрос. Обратите внимание, что ни запросы, ни ответы не содержат информацию о файлах cookie.
В своем посте о CORS команда Mozilla предлагает проверить наличие withCredentials свойства, чтобы определить, поддерживает ли браузер CORS через XHR. Затем вы можете связать с существованием XDomainRequestобъекта все браузеры:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Обратите внимание, что для работы метода CORS вам необходим доступ к механике заголовков сервера любого типа, и вы не можете просто получить доступ к сторонним ресурсам.
Источник: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
window.postMessageметод
window.postMessageпри вызове вызывает MessageEventотправку a в целевом окне, когда завершается любой ожидающий сценарий, который должен быть выполнен (например, оставшиеся обработчики событий, если он window.postMessageвызывается из обработчика событий, предварительно установленные тайм-ауты ожидания и т. д.). MessageEventИмеет сообщение типа, dataсвойство , которое устанавливается на значение строки первого аргумента , предоставленный window.postMessage, originсвойство , соответствующее происхождение основного документа в окне вызывающего window.postMessageв то время window.postMessageназывало, и sourceсвойство , которое является окном , из который window.postMessageназывается.
Чтобы использовать window.postMessage, слушатель события должен быть присоединен:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
И receiveMessageфункция должна быть объявлена:
function receiveMessage(event)
{
// do something with event.data;
}
Внешнее iframe также должно правильно отправлять события через postMessage:
<script>window.parent.postMessage('foo','*')</script>
Любое окно может получить доступ к этому методу в любом другом окне, в любое время, независимо от местоположения документа в окне, чтобы отправить ему сообщение. Следовательно, любой прослушиватель событий, используемый для получения сообщений, должен сначала проверить личность отправителя сообщения, используя свойства источника и, возможно, источника. Это не может быть недооценено: неспособность проверить originи, возможно, sourceсвойства включает атаки сценариев между сайтами.
Источник: https://developer.mozilla.org/en/DOM/window.postMessage