Я создаю свое первое приложение Java EE, используя JSF, PrimeFaces, Glassfish и Netbeans. Поскольку я новичок, возможно, я неправильно подхожу к основной проблеме.
Основная проблема: я хочу поддерживать безопасную информацию пользователя. Похоже, что существуют противоречивые идеи о том, следует ли поддерживать его в сеансе JSF bean или сеансе EJB с состоянием. Я пытаюсь использовать сессионный EJB, поскольку он более безопасен таким образом.
Проблема заключается в том, что мое приложение, похоже, создает несколько экземпляров этого bean, когда я ожидаю, что он его создаст и повторно его использует. Если я обновляю страницу, она запускает @PostConstruct и @PostActivate 3 раза, причем все они имеют разные экземпляры. Затем все они уничтожаются при повторном развертывании приложения.
Я неправильно понял, как он должен работать или что-то неправильно настроено?
Я попытаюсь показать образец обрезанного кода:
 basic.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets
        <c:if test="#{loginController.authenticated}">
            Authenticated
        </c:if>
        <c:if test="#{loginController.authenticated}">
            Authenticated
        </c:if>
        <c:if test="#{loginController.authenticated}">
            Authenticated
        </c:if>
    </h:body>
</html>
 LoginController:
@Named(value = "loginController")
@RequestScoped
public class LoginController implements Serializable {
    @EJB
    private UserBeanLocal userBean;
    public boolean isAuthenticated() {
        return userBean.isAuthenticated();
    }
}
 UserBean (исключая интерфейс UserBeanLocal)
@Stateful
public class UserBean implements UserBeanLocal, Serializable {
    boolean authenticated = false;
    @PostConstruct
    @PostActivate
    public void setup(){
        System.out.println("##### Create user Bean: "+this.toString());
    }
    @Override
    public boolean isAuthenticated() {
        System.out.println("########## Authentication test is automatically passing.");
        authenticated = true;//hard coded for simplicity.
        return authenticated;
    }     
    @PrePassivate
    @PreDestroy
    public void cleanup(){
        System.out.println("##### Destroy user Bean");
    }
}
Наконец, вот результат Glassfish после обновления три раза:
INFO: ##### Create user Bean: [email protected]
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
INFO: ##### Create user Bean: [email protected]
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
INFO: ##### Create user Bean: [email protected]
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
INFO: ########## Authentication test is automatically passing.
