gpt4 book ai didi

java - handleNavigation 在 PhaseListener 中不起作用

转载 作者:行者123 更新时间:2023-12-01 23:52:02 28 4
gpt4 key购买 nike

我有一个 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;
}

}

我的面孔配置

<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>

最佳答案

您正在渲染响应的后阶段执行代码。这是在 JSF 呈现并完成响应之后。此时,整个 HTTP 响应已经完成并完全发送到网络浏览器。

这是一条不归路。您的代码根本来不及更改响应。

改为在恢复 View 阶段监听。或者,更好的是,使用 servlet filter 。 JSF 阶段监听器对于这项工作来说是一个过于笨拙的工具(它不会在非 JSF 请求上启动,并且在 JSF 请求期间最多被触发 12 次)。 servlet 过滤器是完成这项工作的正确工具。您可以在这个答案中找到一个具体的例子:JSF page style missing when using login filter .

关于java - handleNavigation 在 PhaseListener 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com