框架: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);
}
我的问题:
答案 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操作。