gpt4 book ai didi

session - 使用 CDI+JSF 无效 session 不起作用

转载 作者:行者123 更新时间:2023-12-01 06:51:05 25 4
gpt4 key购买 nike

我试图在我的应用程序中实现注销,所以我做了这个:

public String logout(){
try{
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext ex = facesContext .getExternalContext();
ex.invalidateSession();
return "success";
}catch(Exception e){
return "error";
}
}

但是当我检查用户是否已登录时,它说是:
public class AuthenticateListener implements PhaseListener {


@Override
public void afterPhase(PhaseEvent event) {
AuthorizedUser authorized = (AuthorizedUser) Util.getHandler("authorized");
if (authorized.getUser() == null) {
System.out.println("Not Logged");
} else {
System.out.println("Logged");
}
}

@Override
public void beforePhase(PhaseEvent event) {
// TODO Auto-generated method stub

}

@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}

}

我错过了什么吗?在使 session 无效后,我不应该获得 AuthorizedUser (sessionScoped) 的新实例吗?

编辑:添加 getHandler,如果有人需要它;)
public static Object getHandler(String handlerName) {

FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ELResolver resolver = facesContext.getApplication().getELResolver();

Object uh = resolver.getValue(elContext, null, handlerName);
return uh;
}

最佳答案

session 在当前请求-响应中仍然可用。它在下一个请求中不再可用。您需要在无效后发送重定向,以便指示浏览器在给定的 URL 上发送新请求。

return "success?faces-redirect=true"; 
或者,如果您仍在使用老式导航案例(返回值即表明;具有文件名“成功”的 View 很奇怪),然后添加 <redirect/>到导航案例。
如果这仍然不起作用,那么错误在于您如何在 session 中存储用户。例如,它实际上存储在应用程序作用域中,这在您混合 CDI 时可能会发生 @Named 与 JSF @SessionScoped ,或者当您将登录用户分配为静态变量而不是实例变量时。
也可以看看:
  • How to invalidate session in JSF 2.0?
  • Performing user authentication in Java EE / JSF using j_security_check
  • 关于session - 使用 CDI+JSF 无效 session 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350657/

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