Сессия разделена между вкладками - PullRequest
7 голосов
/ 05 июня 2011

У меня есть веб-приложение JAVA, в котором мне нужно остановить совместное использование сеанса между вкладками браузера, что означает

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

Ответы [ 2 ]

8 голосов
/ 05 июня 2011

Обычно файлы cookie используются для обработки сеанса. Затем все вкладки и окна браузера совместно используют один и тот же сеанс. Но вы можете настроить свой контейнер сервлетов на использование перезаписи URL вместо файлов cookie. (Вот пример для Jetty .)

При перезаписи URL-адреса сеанс определяется только с помощью параметра URL-адреса, содержащего идентификатор сеанса. Таким образом, каждый внутренний URL-адрес вашего веб-приложения должен быть расширен с помощью этого параметра, используя метод HttpServletResponse.encodeURL(). Если вы используете веб-фреймворк, такой как Wicket, велика вероятность, что это уже сделано для вас.

С перезаписью URL можно иметь несколько независимых сеансов в разных окнах или вкладках одного и того же экземпляра браузера.

Обновление: В ответ на downvote я хочу прояснить различное поведение перезаписи URL:

Предположим, что URL-адрес веб-сайта http://webapp.com.

Куки: Откройте http://webapp.com на первой вкладке браузера.

Сервер создает сеанс и отправляет cookie в ответ.

Браузер сохраняет куки.

Затем откройте http://webapp.com во второй вкладке браузера. Браузер связывает этот URL с недавно сохраненным файлом cookie и добавляет файл cookie в запрос.

Для сервера нет разницы между запросами из первой или второй вкладки браузера и ответами из одного и того же сеанса. Иногда это желаемое поведение.

Перезапись URL: Откройте http://webapp.com в первой вкладке браузера.

Сервер создает сеанс с идентификатором 1 и добавляет параметр jsessionid = 1 к каждому URL на странице ответа. Файл cookie не передается.

Все дальнейшие запросы к другой странице того же веб-приложения с первой вкладки браузера включают идентификатор сеанса (для примера 1).

Затем откройте http://webapp.com на второй вкладке браузера. В этом и заключается разница! Поскольку в запросе нет файла cookie и параметра jsessionid, сервер создает новый сеанс (т. Е. Идентификатор 2) и добавляет параметр jsessionid = 2 к каждому URL-адресу, содержащемуся на странице ответа. Отныне все последующие запросы из второй вкладки браузера связаны с сеансом 2.

Итак, у вас есть два независимых сеанса в одном браузере.

0 голосов
/ 25 июля 2012

Если вы используете javascript, я могу предоставить вам одно решение.a) Имейте один скрытый параметр на экране входа в систему, задайте имя ветра для этого скрытого поля. b) когда вы входите в систему (отправляете запрос), в классе действия проверьте, не равен ли параметр запроса нулю и равен ли он целевой странице, егодействительный запрос, означает переход на целевую страницу путем входа в систему, если он не перенаправлен на недействительную страницу.

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