Как работает HTTPSession, когда запрос приходит с веб-сервера, а не с веб-браузера? - PullRequest
5 голосов
/ 06 февраля 2012

У меня есть очень простой вопрос, как работает создание HTTPSession. Я знаю, что вы, ребята, уволите меня, рассматривая этот вопрос как похожий вопросов существует. Но есть причины, почему я задаю этот вопрос Вот он: -

Я знаю, что httpsession уникален для веб-браузера, и сервер создает его, когда мы выполняем HttpServletRequest.getSession в первый раз. Он будет поддерживать тот же сеанс, пока мы закройте браузер. Но у меня немного другой сценарий. У меня есть веб-приложение на одном экземпляре tomcat, скажем T1.На странице приветствия этого веб-приложения я предоставил две ссылки, по нажатию на которые я перехожу на один и тот же Java-сервлет (S1) другого веб-приложения, размещенного на другом экземпляре tomcat T2 (эти две ссылки открывает два отдельных всплывающих окна). Теперь сначала я нажимаю ссылку1 и проверяю идентификатор сеанса в S1 и нахожу его значение как 1678. Теперь сначала я нажимаю ссылку2 и проверьте идентификатор сессии в S1 и снова найдите его значение как 1678. Мой вопрос здесь заключается в том, почему я получаю один и тот же идентификатор сеанса для обоих исходящих запросов из ссылки1 и ссылки2? Что я могу сделать, чтобы получить разные сессии для обоих этих запросов?

То, что я пробовал после поиска возможных решений в сети: - При нажатии на ссылку1 в сервлете S1 я скопировал атрибуты сеанса, аннулировал его и создал новый. Скажем, новый идентификатор сеанса 8765. Теперь я нажимаю на ссылку2 и нашел тот же сеанс в этом запросе тоже. Так что я далее лишить законной силы и создаю новый новый идентификатор сеанса 4897). В идеале он должен истечь в первом сеансе работы браузера (генерируется при нажатии ссылки1). Чтобы проверить это, я нажимаю в любом месте всплывающего окна 1, он не получает срок действия истек, но я снова вижу последний сгенерированный идентификатор сеанса, т.е. 4897. Я не понимаю, почему он присоединяет один и тот же идентификатор сеанса к обоим всплывающим окнам?

Ребята, спасибо за ваше терпение, что нашли время и прочитали этот длинный сценарий?

Редактировать: -

      Cookie[] cookies = req.getCookies(); 
        if(cookies!=null) 
        for (int i = 0; i < cookies.length; i++) { 
         cookies[i].setMaxAge(0); 
         context.getResponse().getHttpServletResponse().addCookie(cookies[i]);
        } 

    HttpSession myAppSession = req.getSession();//line 1

Предположим, что по щелчку ссылки1 я получаю идентификатор сеанса как 1234, затем после щелчка по ссылке 2 также получаю тот же идентификатор сеанса. Насколько я понимаю, после выполнения кода выше строки 1, я должен получить другой идентификатор сеанса, так как я устанавливаю MaxAge as0 перед получением сеанса. Но это не происходит?

1 Ответ

11 голосов
/ 06 февраля 2012

Я думаю, это то, что вы ищете :

По умолчанию отслеживание сеанса происходит с помощью файлов cookie . WebServer отправляет идентификатор сеанса в браузер в виде файла cookie . И браузер отправляет cookie с идентификатором сеанса для последующих запросов .

Как браузер определяет, какие куки отправлять для ссылки / запроса? Он основан на этих параметрах. Если запрос соответствует этим параметрам, браузер отправляет этот конкретный файл cookie :

  1. Домен: Доменное имя, на которое делается запрос. Проверьте в вашем случае, если доменное имя одинаково для двух экземпляров
  2. Путь: Если имя пути такое же. Веб-сервер отправляет корневой каталог контекста в качестве пути, запрашивает файлы cookie общего доступа к корневому контексту.
  3. Безопасный: Сервер отправляет, является ли данный cookie безопасным или нет. Это означает, что куки могут быть отправлены по незащищенному каналу.

Эти параметры позволят браузеру отправлять куки на сервер. И поскольку один и тот же файл cookie отправляется для обоих имеющихся у вас экземпляров. Я думаю, что идентификатор сеанса является общим .

Если свойства запроса, такие как URI запроса, домен и путь (т. Е. Корень контекста), совпадают между запросами, то нет способа указать браузеру использовать разные куки.

У вас есть несколько вариантов ниже:

  1. Используйте разные доменные имена.
  2. Используйте разные контекстные корни.
  3. Иметь LB перед двумя узлами и перенаправлять на правильный узел на основе идентификатора сеанса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...