Java: Отслеживание пользователя входит в сессию - Сессия EJBs по сравнению с HTTPSession

Если я хочу отслеживать диалоговое состояние с каждым клиентом, использующим мое веб-приложение, которое является лучшей альтернативой - Бобом Сессии или Сеансом HTTP - для использования?

Использование сеанса HTTP:

//request is a variable of the class javax.servlet.http.HttpServletRequest
//UserState is a POJO
HttpSession session = request.getSession(true);
UserState state = (UserState)(session.getAttribute("UserState"));
if (state == null) { //create default value .. }
String uid = state.getUID();
//now do things with the user id

Использование сессии EJB:

В реализации ServletContextListener, зарегистрированного как веб-приложение Слушатель в WEB-INF/web.xml:

//UserState NOT a POJO this this time, it is
//the interface of the UserStateBean Stateful Session EJB
@EJB
private UserState userStateBean;

public void contextInitialized(ServletContextEvent sce) {
    ServletContext servletContext = sce.getServletContext();
    servletContext.setAttribute("UserState", userStateBean);
    ...

В JSP:

public void jspInit() {
    UserState state = (UserState)(getServletContext().getAttribute("UserState"));
    ...
}

В другом месте в теле того же JSP:

String uid = state.getUID();
//now do things with the user id

Мне кажется, что они являются почти тем же, при этом основное различие - то, что экземпляр UserState транспортируется в HttpRequest.HttpSession в первом, и в a ServletContext в случае последнего.

Какой из этих двух методов более устойчив, и почему?

13
задан BalusC 12 May 2010 в 00:33
поделиться

2 ответа

Как указал @BalusC, в вашем примере EJB будет то же самое для всех клиентов - не то, что вы хотите.

Вы все еще можете изменить это и иметь один EJB для каждого клиента, если, например, вы создаете EJB, когда пользователь входит в систему и сохраняете его в сеансе, или что-то подобное.

Но есть и другие более тонкие различия между использованием HttpSession и сессионного компонента с отслеживанием состояния (SFSB). Особенно эти два:

  1. Обработка исключений . Если транзакция в EJB завершается неудачно, компонент становится недействительным и больше не может использоваться. Это может усложнить стратегию обработки ошибок в веб-приложении.
  2. Параллелизм . Одновременный доступ к одному и тому же SFSB невозможен, поэтому вам нужно будет синхронизировать его на веб-уровне. Опять же, это может усложнить конструкцию.

См. Этот ответ для более подробной информации: Правильное использование SFSB с сервлетами

В итоге: я бы посоветовал использовать подход HttpSession и против SFSB в вашем случае; используйте SFSB только в том случае, если он предоставляет то, что вы не можете сделать с HttpSession , что не так.

11
ответ дан 2 December 2019 в 00:02
поделиться

ServletContext представляет область приложения. Атрибуты области приложения являются общими для всех запросов во всех сеансах. Это «глобальные приложения для всего приложения». Вы не хотите хранить там информацию о клиенте (а значит, о сеансе). Если новый клиент входит в систему, существующий EJB в области приложения будет заменен специфичным для клиента и будет отражен для всех клиентов.

Область сеанса предназначена именно для этой цели. Используйте это.

3
ответ дан 2 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: