Я хочу реализовать следующее поведение в моем приложении Java EE - когда пользователь входит в систему и после того, как он закрывает браузер или снова открывает страницу входа, его сеанс должен быть аннулирован (поэтому бины SessionScope воссоздаются).
Решение, которое у меня сейчас есть:
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) Боб Logout:
@Named
@RequestScoped
public class LogoutBean implements Serializable {
public void logout() {
FacesContext
.getCurrentInstance().getExternalContext().invalidateSession();
}
}
3) Бин входа в систему:
@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, я получил исключение «Сессия уже недействительна» в методе getBample get () () LoginBean.
Я не понимаю, почему сеанс, введенный через Cdi, все еще указывает на старый недействительный сеанс.
Я использую CDI 1.2, JSF 2.2