在JSF中使用导航

时间:2011-09-20 16:57:37

标签: jsf jsf-2

框架:JSF 2.0。

我的问题:我有一个名为login.xhtml的页面。每当有人查看该页面时,它都会调用一个称为“身份验证过滤器”的过滤器。过滤器将检查,如果用户已经插入,它将根据用户的角色重定向到默认值(例如:管理员将转到“admin / admin.xhtml”,学生将被重定向到“user / user.xhtml”)

我的解决方案:使用 JSF导航

我的配置:

面向-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”)时,它会不重定向 me to admin.xhtml (我还在登录.xhtml)。如何解决这个问题?
  2. 任何框架都支持我解决这个问题?

1 个答案:

答案 0 :(得分: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()

最后但并非最不重要的一点是,您需要确保在提交响应之前调用{strong} ,否则它将无法正常工作,您的服务器日志将会被{ {1}}错误。您可以在提交响应之前使用IllegalStateException: response already committed来调用bean操作。

另见: