Получая исключение фрейма перекрестного источника для URL-адресов в одном домене, один URL-адрес открывается посредством обратного вызова со стороннего веб-сайта - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь закрыть эту страницу и обновить родительскую страницу, используя код:

window.opener.windowClosing();
self.close();

Я получаю эту ошибку:

Uncaught DOMException: заблокирован фрейм с происхождением "aaa.bbb.com" от доступа к фрейму перекрестного происхождения. на aaa.bbb.com/xxx

Это происходит, даже если оба URL-адреса находятся в одном домене. Я попытался проверить домен с помощью «document.domain», и я получаю следующие доменные имена:

aaa.bbb.com - bbb.com

aaa.bbb.com/xxx - aaa.bbb.com

В этом случае aaa.bbb.com/xxx - это URL-адрес обратного вызова, который был вызван сторонней интеграцией для предоставления кода для авторизации. Этот URL-адрес обратного вызова показывает субдомен, но родительская страница этого не показывает.

Я думал, что проблема была вызвана URL-адресом со стороннего веб-сайта. Но затем я использовал window.open, чтобы открыть этот URL-адрес обратного вызова, и при закрытии я получаю то же значение document.domain и то же исключение.

1 Ответ

0 голосов
/ 11 апреля 2019

Вы можете попробовать явно установить document.domain на обеих страницах так, чтобы они совпадали.

document.domain = 'aaa.bbb.com';

Или вы можете использовать window.postMessage ()

Родительский документ:

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
  if (event.origin.indexOf('bbb.com') < 0 {
    return;
  } else if (event.data == 'closing'){
    windowClosing()
  }
}

Дочерний документ:

window.opener.postMessage('closing', '*');
self.close();

Если дочернее окно на самом деле является фреймом или фреймом, а не отдельным окном, вы должны использовать:

window.parent.postMessage('closing', '*');
self.close();

В любомВ этом случае необходимо убедиться, что протокол (http / https) и порт одинаковы для обоих окон / фреймов.

...