是实施注销行动的正确方法吗? (使用PostConstruct方法是错误的吗?)
@Named
@RequestScoped
public class Logout extends Root{
@PostConstruct
public void logout(){
getSession().invalidate();
try{
getExternalContext().redirect("/login.xhtml?faces-redirect=true");
} catch(Exception ex) {
Logger.getLogger(LoginBacking.class.getName()).log(Level.SEVERE, null, ex);
getContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, getBundle().getString("logoutError"), ex.getMessage()));
}
}
}
答案 0 :(得分:1)
这是一个@RequestScoped
bean,在被要求这样做之前,cdi容器甚至都不会去创建它。也就是说,我认为你会从你的jsf页面调用Logout.logout()
,如果是这样,为什么还要使用@PostConstruct
?它没有任何意义,或者更确切地说,在长时间调用@PostConstruct
之后,从页面调用Logout.logout()将只是第二次调用。
简单来说,这里不需要使用@PostConstruct
。从jsf简单地调用Logout.logout()
就足够了。
此外,在jsf生命周期中,可以分别调用方法,因此在实现getSession()
注销时,请确保不要创建另一个。否则你将多次创建和销毁会话。