我的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如何克服这种情况?
This似乎是一个不同的问题,或者至少似乎有一个不同的解决方案。
在我最近的测试中,似乎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()
}
},
我还不清楚为什么这会触发该块,因为脚本与应用程序的其余部分来自同一来源。