我正在尝试在我的应用程序中实现注销,所以我做到了:
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;
}
}
我错过了什么吗?在使会话无效后,我不应该获得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;
}
答案 0 :(得分:1)
会话仍在当前请求 - 响应中可用。它在下一个请求中不再可用。您需要在invalidate之后发送重定向,以便指示浏览器在给定的URL上发送新请求。
return "success?faces-redirect=true";
或者,如果您仍在使用旧式导航案例(返回值表示;具有文件名“成功”的视图很奇怪),请将<redirect/>
添加到导航案例中。
如果仍然无效,则错误在于您如何将用户存储在会话中。例如,它实际上存储在应用程序范围中,当您将CDI @Named
与JSF @SessionScoped
混合使用时,或者您将登录用户指定为静态变量而不是实例变量时,可能会发生这种情况。
答案 1 :(得分:-1)
在注销方法中使用这段代码:
HttpSession oldsession = (HttpSession) FacesContext
.getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();
这会奏效。如果它对你有帮助,请告诉我。