当会话无效时,Cdi注入HttpSession

时间:2018-08-27 19:31:07

标签: jsf java-ee cdi

我想在我的Java EE应用程序中实现以下行为-登录用户时,在关闭浏览器或再次打开登录页面后,其会话应无效(因此,将重新创建SessionScope Bean)。

我现在拥有的解决方案:

1)登录页面:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

   <f:metadata>
      <f:event type="preRenderView" listener="#{logoutBean.logout}"/>
   </f:metadata>

   <f:view>
      <h:form>
         <h:outputLabel value="Login"/>
         <h:outputText value="#{loginBean.sampleAttr}"/>
         <h:commandButton value="Login" action="#{loginBean.authenticate()}"/>
      </h:form>
   </f:view>
</html>

2)注销bean:

@Named
@RequestScoped
public class LogoutBean implements Serializable {

    public void logout() {
        FacesContext
          .getCurrentInstance().getExternalContext().invalidateSession();
    }

}

3)登录bean:

@Named
@ViewScoped
public class LoginBean implements Serializable {

    @Inject
    private HttpSession session;

    @PostConstruct
    public void init() {
        session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    }

    public String getSampleAttr() {
        return session.getAttribute("Sample") != null ? session.getAttribute("Sample").toString() :"";
    }

    public String authenticate() {
        return "default";
    }
}

要使无效后的会话正确,我必须分配从FacesContext获得的会话值。当我使用@Inject中的会话时,我在LoginBean getSampleAttr()方法中收到“会话已失效”异常。

我不明白为什么通过Cdi注入的会话仍然指向无效的旧会话。

我正在使用CDI 1.2,JSF 2.2

0 个答案:

没有答案