我有一个PhaseListener来控制用户访问一些页面,如果用户没有登录,他被重定向到登录页面。
问题是我的方法handleNavigation没有重定向用户。它会运行,但不会重定向用户。
当用户键入不应具有访问权限的url时,该方法将运行,但页面将打开,而不会重定向到登录页面。
怎么啦?
public class AuthorizationListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currentPage = facesContext.getViewRoot().getViewId();
boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);
if(isLoginPage)
return;
if(currentPage.indexOf("/rws/") != -1)
{
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
Object currentUser = session.getAttribute("usuario");
if (!isLoginPage && currentUser == null) {
NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
nh.handleNavigation(facesContext, null, "loginPage");
}
}
}
public void beforePhase(PhaseEvent event) {
System.out.println("Hellow World");
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}我的faces-config
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>loginPage</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<lifecycle>
<phase-listener>br.com.testes.filter.AuthorizationListener</phase-listener>
</lifecycle>发布于 2013-04-24 20:30:31
您在render response的后期阶段执行代码。因此,这是在JSF呈现并完成响应之后。此时,整个HTTP响应已经完成,并完全发送到sent浏览器。
这是一个无可挽回的点。为了改变响应,你的代码已经太迟了。
改为在还原视图阶段进行监听。或者,更好的做法是使用servlet filter。JSF阶段侦听器对于作业来说是一个过于笨拙的工具(它不会在非JSF请求中起作用,并且在JSF请求期间被触发多达12次)。servlet筛选器是适合这项工作的工具。你可以在这个答案中找到一个具体的例子:JSF page style missing when using login filter。
https://stackoverflow.com/questions/16192003
复制相似问题