Почему я * непоследовательно * получаю DOMException: заблокировал фрейм с источником «https://ec2b.foo.com» от доступа к фрейму с перекрестным источником - PullRequest
1 голос
/ 08 мая 2020

Вот мой код

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
setTimeout(function() {console.log(tl2010handle.window.location.href)}, 2000); 

Если я загружу свою страницу как https://ec2b.foo.com/console/login2020.jsp, я получу DOMException: Blocked a frame with origin "https://ec2b.foo.com" from accessing a cross-origin frame.

Если я добавлю запись 143.67.75.100 ec2b в / etc / hosts, а затем загрузить мою страницу как https://ec2b/console/login2020.jsp, она работает, и моя консоль регистрирует href.

Тайна в том, что я открываю окно с URL-адресом, который не указывает источник, поэтому я не понимаю, как Chrome может пожаловаться на то, что мой запрос является кросс-источником.

Код существует только на одном сервере, поэтому нет никакой возможности, чтобы ec2b и ec2b.foo.com были разными. Также подтверждено копанием. Я пробовал это как в Chrome, так и в Firefox с тем же результатом, хотя в случае Firefox переменная tl2010handle не установлена ​​в первом случае и установлена ​​во втором случае.

1 Ответ

0 голосов
/ 13 мая 2020

Загадка в том, что я открываю окно с URL-адресом, который не указывает источник

У вас неправильное представление о заголовке запроса . Источник отправляется браузером при этих обстоятельствах ... в случае сценариев JavaScripts источник наследуется от страницы, на которой выполняется сценарий . Сообщение об ошибке, которое вы получаете, указывает на то, что ваше происхождение установлено на: «https://ec2b.foo.com»

Код существует только на одном сервере, поэтому нет возможности, что ec2b и ec2b.foo.com разные.

Обратите внимание, что одинаковый источник не означает одинаковый IP. Это означает, что кортеж protocol: host: port должен быть точно таким же, что означает, что foo.com, ec2b.foo.com и www.foo.com имеют разное происхождение (даже если все они указывают на один и тот же IP-адрес).


Сообщение об ошибке указывает, что для вашего JavaScript задано происхождение: «https://ec2b.foo.com» ... теперь в вашем JavaScript файле вы открываете новое окно браузера, запустив следующее:

window.open("/path/main.html", ....); // <-- open a new browser window

Вы не упомянули, какой URL-адрес вы видите в этом новом окне (я подозреваю, что это «https://ec2b/path/main.html»). .. но это определенно не «https://ec2b.foo.com», поэтому, когда вы пытаетесь получить доступ к location.href этого нового окна, вы получаете блокировку, потому что это запрос Cross-Origin.

Согласно MDN : Window.Open() возвращает объект Window, представляющий только что созданное окно:

Возвращенная ссылка может использоваться для доступа к свойствам и методам нового окна, если оно соответствует требованиям безопасности политики Same-origin .

Вы также можете попробовать запустить следующий сценарий, чтобы выяснить происхождение вашего JavaScript файл:

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
console.log(tl2010handle.origin); // <-- origin of your script file
/*
 * if you compare: tl2010handle.origin with the url display in tl2010handle window
 * it should clarify why you are having a cross-origin request.
 */
...