在JSF中使用导航

  • 本文关键字:导航 JSF jsf jsf-2
  • 更新时间 :
  • 英文 :


框架:JSF 2.0。

我的问题:我有一个页面,叫做login.xhtml。每当有人查看该页面时,它都会调用一个名为Authentication filter的过滤器。过滤器将检查,如果用户已经登录,它将根据用户的角色重定向到default(例如:Admin将转到" Admin/Admin .xhtml", student将重定向到"user/user.xhtml")。

我的方案:使用JSF导航

我配置

:

faces-config.xml

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>AD</from-outcome>            
        <to-view-id>/admin/admin.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>US</from-outcome>            
        <to-view-id>/user/user.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

使用导航的重定向:

public static void redirectUsingNavigation(String from, String outCome) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, from, outCome);
}

问题:

  1. 当我运行redirectUsingNavigation("*","AD")redirectUsingNavigation(null,"AD"),它做不重定向我到admin.xhtml(我仍然在登录.xhtml)。如何解决这个问题?
  2. 在这个问题上有任何框架支持我吗?

这段代码根本没有重定向。它只是转发请求。它只是对不同的目标页面使用相同的请求对象)。真正的重定向指示浏览器在给定的Location标头上发送新的请求。你可以看到这个变化反映在浏览器的地址栏中。

您需要或者faces-redirect=true参数添加到结果中以触发重定向(如果您使用隐式导航而不是冗长导航情况下,这尤其有用):

navigationHandler.handleNavigation(facesContext, from, outCome + "?faces-redirect=true")

添加<redirect/>到导航案例,如果你想他们总是发生:

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>AD</from-outcome>            
        <to-view-id>/admin/admin.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>US</from-outcome>            
        <to-view-id>/user/user.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>
最后但并非最不重要的是,您需要确保在响应提交之前调用handleNavigation() ,否则它将根本不起作用,并且您的服务器日志将被IllegalStateException: response already committed错误所破坏。您可以使用<f:event type="preRenderView">在提交响应之前调用bean操作。

参见:

  • jsf导航问题
  • 点击bean方法并重定向GET请求

相关内容

  • 没有找到相关文章

最新更新