【问题标题】:Conditional redirection in JSFJSF 中的条件重定向
【发布时间】:2012-01-14 00:05:37
【问题描述】:

是否有内置机制可以有条件地重定向到另一个视图?如果他/她已经登录,我希望用户从登录页面重定向到“主页”。

我已经有两种基本方法,但第一种我不知道如何实现,第二种是一种肮脏的解决方法。

  1. 添加<meta http-equiv="Refresh" content="0; URL=home.jsf" />并让它有条件地呈现(EL:#{login.loggedIn}
  2. 添加一个<h:panelGroup />,它也将被有条件地呈现,其中包含一些执行重定向的 JavaScript。

有没有办法实现 1 甚至是另一种更优雅的解决方案? :-)

谢谢

【问题讨论】:

    标签: jsf redirect


    【解决方案1】:

    您可以为此使用<f:event type="preRenderView">

    例如

    <f:event type="preRenderView" listener="#{login.checkAlreadyLoggedin}" />
    

    public void checkAlreadyLoggedin() throws IOException {
        if (isLoggedIn()) {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
            ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
        }
    }
    

    【讨论】:

    • 完美!像魅力一样工作,谢谢。与此同时,我发现并尝试了另一种方法:我实现了一个专门为登录页面注册的过滤器,但它失败了,因为我无法访问@SessionScopedlogin bean 和它管理的User。会话是空的...?!
    • 过滤器仅适用于 JSF @ManagedBean,不适用于 CDI @Named bean。
    • 为什么不能从 preRenderView 事件的侦听器方法返回字符串,如 return "home.xhtml?faces-redirect=true" 工作(不进行重定向)?
    • @Tiny:因为它是一个监听器方法而不是一个动作方法。本质上,监听器方法在这里被滥用了。这就是 JSF 家伙在 JSF 2.2 中引入 &lt;f:viewAction&gt; 的原因,它应该是适合这项工作的工具。
    【解决方案2】:

    @BalusC 提出的解决方案在视图“home.xhtml”不是 JSF portlet 的默认视图的情况下不起作用。对于那些需要在渲染阶段重定向到非默认视图的人,我建议在this entry 中列出解决方案。也就是说,在preRenderView 方法中执行以下操作:

    FacesContext fc = FacesContext.getCurrentInstance();
    NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();
    navigationHandler.handleNavigation(fc, null, "/views/nonDefaultView.xhtml?faces-redirect=true");
    fc.renderResponse();
    

    感谢@Frizz1977

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 2012-11-06
      • 2010-11-01
      • 2013-06-26
      • 2021-10-31
      • 2017-12-19
      • 2012-02-04
      • 2012-01-09
      相关资源
      最近更新 更多