框架: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);
}
问题:
- 当我运行redirectUsingNavigation("*","AD")或redirectUsingNavigation(null,"AD"),它做不重定向我到admin.xhtml(我仍然在登录.xhtml)。如何解决这个问题? 在这个问题上有任何框架支持我吗?
这段代码根本没有重定向。它只是转发请求。它只是对不同的目标页面使用相同的请求对象)。真正的重定向指示浏览器在给定的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请求