Как отслеживать сеанс для каждого запроса сервлета, пока я его не использую? Синглтоны не будут работать? - PullRequest
2 голосов
/ 20 мая 2010

Для каждого запроса сервлета, который я получаю, я передаю, возможно, 10 методов, прежде чем я окажусь там, где мне нужно что-то проверить в сеансе, и мне нужен HttpSession.

Единственный способ получить HttpSessionверно из HttpServletRequest?

Как отслеживать сеанс для каждого запроса сервлета?К сожалению, я не могу просто сделать синглтон (например, SessionInformation.instance (). GetAttribute ("name")), потому что тогда этот сеанс будет использоваться для всех запросов.

Есть ли способ сохранить сеанс глобально длякаждый запрос без необходимости передавать его (или информацию) по всем методам на всякий случай, если он мне нужен?

Обновление 1:

Алохчи подтолкнул меня в правую сторонунаправление.Мне нужно что-то, что может либо:

1) Управление для хранения переменных глобально только через поток.Решение "Singleton-per-Thread"?

2) Или существует уникальный идентификатор для каждого потока / запроса, который получает сервлет?Если так, то что?

Ответы [ 3 ]

6 голосов
/ 20 мая 2010

Как отслеживать сеанс для каждый запрос сервлета?

Сервер идентифицирует своих пользователей, помечая их с помощью файла cookie, который содержит идентификатор сеанса в их браузерах. На сервере сеанс - это место, где вы размещаете данные, которые необходимо отслеживать во время взаимодействия клиент-сервер (чтобы передать состояние приложению).

session.setAttribute("name", SerializableObject)

Примечание: Поскольку App Engine сохраняет данные сеанса в хранилище данных и в кэше памяти, все значения, хранящиеся в сеансе, должны реализовывать интерфейс java.io.Serializable.

Затем вы можете извлечь сеанс из запроса HttpServletRequest, выполнив

request.getSession()

см. Javadoc: здесь

После извлечения сеанса из вашего сервлета вы используете session.getAttribute("name"), чтобы получить любые интересующие вас данные, чтобы отслеживать взаимодействие.

Есть ли способ сохранить сеанс глобально для каждого запроса

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

Вот пример запроса , который поставляется с файлом cookie идентификатора сеанса:

GET /something.htm HTTP/1.1     
Accept: www/source     
Accept: text/html     
Cookie: sessid=123456789

Вы не можете хранить эту информацию глобально, она уникальна для каждого запроса.

Без необходимости проходить его

При выполнении полезных действий с данными не передавайте сеанс вашим методам, передавайте полезную информацию, такую ​​как имя пользователя, содержимое корзины и т. Д.

HttpSession session = request.getSession() //inside a servlet
String userName = session.getAttribute("name");
List<ShoppingItems> items= session.getAttribute("cart");

MakeTheUserPay(userName, items) //no session passing here

Ваши методы бизнес-логики не должны даже знать, что такое сессия. Это больше похоже на артефакт.

2 голосов
/ 20 мая 2010

Я думаю, что вам нужна переменная java.lang.ThreadLocal .

1 голос
/ 20 мая 2010

Я думаю, вам нужно использовать объект контекста для передачи состояния между вашим уровнем представления и бизнес-уровнем (я предполагаю, что он существует).

Объект Context позволяет инкапсулировать состояние и передавать его по уровням, не беспокоясь о том, как поддерживается само состояние. Вы можете обратиться к шаблону проектирования Context Object в книге Core J2EE Patterns, если вам нужно получить больше информации в этой области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...