我想在我的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