点击 bean 方法并在 GET 请求上重定向
Posted
技术标签:
【中文标题】点击 bean 方法并在 GET 请求上重定向【英文标题】:Hit a bean method and redirect on a GET request 【发布时间】:2011-11-21 05:44:44 【问题描述】:我在 GlassFish 上使用 JSF 2 和 PrimeFaces 2.1。
我有一个页面旨在允许人们在遵循回调 URL 后执行操作(例如,作为嵌入在电子邮件中的链接或作为某些外部身份验证或支付服务的回调 URL 参数)。就我而言,我需要重置密码。回调 URL 有一个 token
GET 参数,如下所示:
http://example.com/app/resetPasswordForm.jsf?token=abc123
在resetPasswordForm.jsf
的页面加载时,我需要检查令牌是否有效,如果无效则重定向到主应用屏幕。
我的想法是有一个像这样的bean方法:
public String resetPasswordHandler.showResetForm(String token)
if /* token is valid */
return "resetPasswordForm.jsf";
else
return "main.jsf";
但是我如何使该方法在页面加载时受到打击?
不确定如何进行——欢迎提出建议。
【问题讨论】:
我在 GlassFish 上使用 JSF2(带有 Primefaces 2.1)——谢谢 【参考方案1】:在渲染视图之前使用<f:viewAction>
触发一个bean 方法并简单地返回一个导航结果(这将被隐式地视为重定向)。
例如
<f:metadata>
<f:viewParam name="token" value="#authenticator.token" />
<f:viewAction action="#authenticator.check" />
</f:metadata>
与
@ManagedBean
@RequestScoped
public class Authenticator
private String token;
public String check()
return isValid(token) ? null : "main.jsf";
// Getter/setter.
如果您还没有使用 JSF 2.2,那么您可以将 <f:event type="preRenderView">
解决方法与 ExternalContext#redirect()
结合使用。
<f:metadata>
<f:viewParam name="token" value="#authenticator.token" />
<f:event type="preRenderView" listener="#authenticator.check" />
</f:metadata>
与
@ManagedBean
@RequestScoped
public class Authenticator
private String token;
public void check() throws IOException
if (!isValid(token))
FacesContext.getCurrentInstance().getExternalContext().redirect("main.jsf");
// Getter/setter.
另见:
Communication in JSF 2.0 - Processing GET request parameters What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? How do I process GET query string URL parameters in backing bean on page load?【讨论】:
看起来很棒,效果很好!还有一个问题,当我因为 externalContext.redirect 将 FacesMessage 添加到 FacesContext 时,faces 消息不会出现在“main.jsf”上。这正常吗?有没有办法让它发挥作用? 是的,这很正常。 Faces 消息是请求范围的。重定向指示浏览器触发一个全新的 HTTP 请求。您需要在重定向 URL 中传递请求参数并让显示消息在该 URL 上截获,或者使用true
调用 Flash#setKeepMessages()
以通过 cookie 恢复它们(然而,这反过来又存在一个奇怪的错误Mojarra 在某些情况下,因此请注意这一点,另请参阅 java.net/jira/browse/JAVASERVERFACES-1751 )。
你能解释一下如何使用验证器在 以上是关于点击 bean 方法并在 GET 请求上重定向的主要内容,如果未能解决你的问题,请参考以下文章
我希望我的 php 表单提交数据并在同一页面但不同的选项卡上重定向