我所在的团队有兴趣使用ui:include将外部资源嵌入到HTML文档中。在调查如何执行此操作时,我发现了这篇文章:JSF Facelets how to include external html?
BalusC澄清说,这是在HTML文档中嵌入外部资源的错误工具,而是建议使用iframe。我的问题是:为什么它是错误的工具?
我所在的团队特别关注安全问题。内容完全是我们自己的内容,但是在iframe之间进行通信时会出现跨站点脚本问题。我已经读过使用iframe也有安全上的好处。
由于答案可能取决于用例,我将描述我的:
我们正在使用名为wcdocker(http://docker.webcabin.org/)的对接框架,它允许将面板添加为div(计划使用ui:include)或通过iframe添加。
从我到目前为止所阅读/经历的内容来看,我主要担心的是你必须为给定的面板加载整个页面,即使用户可能实际上没有打开它。将有多个码头工人,每个码头工人将有大约50个可以打开的面板。我担心客户端会被淹没,相比于在给定的docker中可能/不可能打开的简单链接。
如果用户尝试两次打开同一个面板(相同的ID标签,omnifaces套接字冲突,其中支持bean为视图加载的收件人声明PushContext等),我的第二个问题是冲突。我已经阅读了其中一些的解决方法,听起来很头疼......
他们主要关心的是面板之间的通信和跨站点脚本攻击。他们认为用户的面板通信应该直接在客户端进行,这样服务器就不必被击中了。我相信用户的面板通信应该通过自定义发布/订阅方法(而不是通过JMS)在服务器端完成,其中面板A发布到自定义Java“主题”对象,面板B订阅该主题。
对于上下文,一次最多只有50个用户,Web应用程序将相当复杂。
答案 0 :(得分:1)
经过大量研究,我的问题至少有一个问题:我们的内容不会是"外部"一点都不它将是与主应用程序驻留在同一服务器上的内容。
无论如何,似乎至少有一个关于iframe的问题是拥有太多的观看状态。此主题与该问题最相关:JSF multiple views limit。视图数量有限(15):( ViewExpiredException after upgrade to jsf2) 您可以在web.xml文件中增加该限制,但可能很难为上述问题确定正确的编号。
在另一个帖子中,BalusC表示ui:include 是将xhtml放入另一个xhtml(How to include another XHTML in XHTML using JSF 2.0 Facelets?)的最佳方法。但是,ui:include似乎不是动态内容的理想选择。使用wcdocker,可以随时添加/删除面板。使用jquery的加载方法作为替代方案可能是值得的。请参阅此主题以获取更多信息,即使它适用于PHP的ui:include:Best way of loading/including content? (jQuery's load() vs. PHP's include())
对于任何有兴趣在JSF项目中使用wcdocker同时避免使用iframe的人来说,这段代码是一个很好的起点:
myDocker.registerPanelType('My Panel', {
onCreate: function (myPanel) {
var $mydiv = $('<div id="div1"></div>');
myPanel.layout().addItem($mydiv, 0, 1).css('text-align', 'right').stretch('1%', '');
myPanel.on(wcDocker.EVENT.LOADED, function() {
$("#div1").load("thepage.xhtml");
});
}
});
最后,您可能仍会遇到ID冲突的问题,特别是如果您同时加载同一页面。此线程可以帮助您解决该问题,甚至可以通过url参数确定ID:Avoiding duplicate ids when reusing facelets compositions in the same naming container