У меня проблема с моей страницей JSF.
TomEE загружает «заголовки безопасности» в web.xml
, один из них - X-Frame-Options DENY
.Моя страница JSF загружается правильно, но после того, как я использую кнопку (которая загружает изображение Part
), я получаю следующую ошибку в консоли JS:
xx.xhtml?a=http%3A%2F%2F....8:1 Refused to display 'https://....xhtml' in a frame because it set 'X-Frame-Options' to 'deny'.
jsf.js.xhtml?ln=javax.faces:1 Uncaught DOMException: Blocked a frame with origin "https://...." from accessing a cross-origin frame.
at FrameTransport.callback (https://..../javax.faces.resource/jsf.js.xhtml?ln=javax.faces:1:5045)
at HTMLIFrameElement.<anonymous> (https://..../javax.faces.resource/jsf.js.xhtml?ln=javax.faces:1:5695)
callback @ jsf.js.xhtml?ln=javax.faces:1
(anonymous) @ jsf.js.xhtml?ln=javax.faces:1
load (async)
open @ jsf.js.xhtml?ln=javax.faces:1
AjaxEngine.req.sendRequest @ jsf.js.xhtml?ln=javax.faces:1
sendRequest @ jsf.js.xhtml?ln=javax.faces:1
request @ jsf.js.xhtml?ln=javax.faces:1
ab @ jsf.js.xhtml?ln=javax.faces:1
onchange @ .....xhtml?a=http%3A%2F%2F.....8:147
Изображение было загружено, если я обновлю всю страницу, я смогу увидеть новое изображение.Но это похоже на то, что после загрузки Ajax JSF-скрипт не может его отрендерить и выдает ошибку (возможно, он имеет какое-то отношение к тому, что изображение загружается из другого порта того же сервера, но нет фрейма или чего-то в этом роде, простоповторная визуализация изображения).
Удаление защитного заголовка будет работать, но, конечно, я не думаю, что это хорошая идея.Как JSF может преодолеть эту ситуацию?
Эта кажется другой проблемой или, по крайней мере, может иметь другое решение.
В моих недавних тестахкажется, что X-Frame-Options SAMEORIGIN
может работать.Это правильный способ справиться с этим?
Очевидно, jsf.js
использует frames
для некоторой функциональности.Я не понимаю, почему:
callback: function() {
if (this.aborted) {
return
}
var iFrameDoc;
var docBody;
try {
var evt = {};
iFrameDoc = this.frame.contentWindow.document || this.frame.contentDocument || this.frame.document;
docBody = iFrameDoc.body || iFrameDoc.documentElement;
this.responseText = docBody.innerHTML;
this.responseXML = iFrameDoc.XMLDocument || iFrameDoc;
this.status = 201;
this.readyState = 4;
this.onreadystatechange(evt)
} finally {
this.cleanupReqParams()
}
},
Мне также непонятно, почему это вызывает блок, так как скрипт приходит из того же источника, что и остальная часть приложения.