ICEfaces:如何禁用某些表单的发送 - 接收 - 更新机制

时间:2009-02-19 08:39:25

标签: java ajax jsf icefaces

我是ICEfaces的新手,但已经具备了JSF / Facelets和Java EE的经验。

目前,除了一些像outputStyle和outputDeclaration这样的实用程序标签之外,我并没有使用很多ICEfaces,但即使这样也很好。

即使我计划稍后使用一些AJAX功能,我也有一些h:表单(或ice:表单),我希望将其作为正常的JSF POST请求发送,而不通过/ block / send-receive-updates。原因是,我想使用一个过滤器,它对所请求的URI起作用,如果所有内容都发送到/ block / send-receive-updates,这是不可能的。

有没有办法做到这一点?

编辑:澄清我想要做的事情:

我们正在开发的网站包含公开可用的网页和一些只有注册会员才能访问的网页。 servlet标准中定义的基于FORM的标准安全机制非常不灵活,因为它只允许定义一个显示的单个登录页面,当有人想要访问某些受限制的内容时。因为我们还希望用户能够使用每个页面上可见的小登录表单登录,所以我们开发了一个过滤器,它几乎像Web容器一样处理身份验证和授权。如果用户未经过身份验证/授权,它会重定向到自定义登录页面,但也允许从backing-bean对用户进行身份验证。为了使它几乎透明地工作,它包装HttpServletRequest以提供Principal和用户角色。

当过滤器重定向到自定义登录页面时,它会在用户成功通过身份验证后保存当前请求以“重播”它。为此,如果POST请求来自登录页面(并且因此如果用户现在已经过身份验证/授权),则过滤器必须能够检测到。但是,如果每个POST都通过/ block / send-receive-updates进行,那么这不再起作用了。

当然我可以排除登录页面被ICEfaces处理,但这意味着我无法在登录页面上使用任何ICEfaces / AJAX。

2 个答案:

答案 0 :(得分:1)

我已经使用IceFaces近一年了,并且还没有通过发送 - 接收 - 更新提交表单的任何方式。但我很好奇,你说“我打算以后再使用一些AJAX功能”。 IceFaces的观点是它几乎透明地将AJAX添加到您的JSF应用程序中。这是一种“全有或全无”的东西 - 任何使用IceFaces的页面都会使用AJAX。

我能想到的唯一一件事就是不要将IceFaces用于你想要使用POST请求的页面 - 也就是说你可以将IceFaces页面映射到* .iface,而将正常的JSF映射到* .faces。

或者,可能还有其他方法可以完成您想要使用过滤器做的事情。

答案 1 :(得分:1)

这可能不是执行此操作的最佳方式,但它可能是 方式。为了争论,我会假设您的标题包含您额外的登录表单。如果您要在单独的框架或主布局页面中创建标题并将您的JSF页面嵌入到iframe中,这可能会起作用。这个想法是因为它被渲染为一个单独的页面,你可以单独处理它。

此外,可能有一种不同的方法来处理您的安全性,这将使这更多的IceFaces-y。也许,当你点击过滤器并确定你没有登录时,它应该创建一个bean(可能是会话),它保存原始请求中的信息(URL,参数等)并将你发送到登录页面。登录页面执行其操作,添加安全性内容,然后使用该会话Bean中的信息强制重定向到新页面。您可以使用FacesContext来获取HttpContext并执行重定向。您可能需要使用重定向来添加任何适当的参数。最后,你应该摆脱会话bean。

最后,我知道有一些框架(Spring WebFlow, spring )会保存您的请求状态,让您进行登录,并将您重定向到您所在的位置在第一个地方非常无缝地进行(这让我想起,我认为Seam也可以做到这一点。也许是Orchestra和你的其他框架。)

希望这有帮助!