实施注销行动

时间:2014-08-24 17:29:42

标签: jsf logout

是实施注销行动的正确方法吗? (使用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()));
        }        
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个@RequestScoped bean,在被要求这样做之前,cdi容器甚至都不会去创建它。也就是说,我认为你会从你的jsf页面调用Logout.logout(),如果是这样,为什么还要使用@PostConstruct?它没有任何意义,或者更确切地说,在长时间调用@PostConstruct之后,从页面调用Logout.logout()将只是第二次调用。

简单来说,这里不需要使用@PostConstruct。从jsf简单地调用Logout.logout()就足够了。

此外,在jsf生命周期中,可以分别调用方法,因此在实现getSession()注销时,请确保不要创建另一个。否则你将多次创建和销毁会话。