我有一个PhaseListener来控制用户对某些页面的访问,如果没有登录用户,他会被重定向到loginpage。
问题是我的方法handleNavigation没有重定向用户。 它运行但不重定向用户。
当用户键入不应具有访问权限的网址时,该方法会运行但页面会打开而不会重定向到登录页面。
有什么问题?
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>
答案 0 :(得分:3)
您在渲染响应的后期执行代码。因此,在JSF呈现并完成响应之后。此时,整个HTTP响应已经完成并完全发送到Web浏览器。
这是一个不归路。为了改变响应,你的代码太迟了。
请改为监听恢复视图阶段。或者,更好的是,使用servlet filter。 JSF阶段监听器对于该作业来说是一个过于笨拙的工具(它不会引发非JSF请求,并且在JSF请求期间最多触发12次)。 servlet过滤器是该作业的正确工具。你可以在这个答案中找到一个具体的例子:JSF page style missing when using login filter。