Управление сессиями Tomcat - независимая сессия на одном хосте
У меня есть простой JSP-сайт на Tomcat. Для работы с сессией я использую простой jsp session
объект.
Но мне нужна изоляция некоторых сессий в моих веб-каталогах.
mysite.com/dir1
mysite.com/dir2
Я хочу использовать независимые сессии для каждого dir1
а также dir2
Это возможно с минимальной коррекцией jsp-кода и без использования виртуальных хостов?
2 ответа
Tomcat предлагает некоторый контроль над путем cookie cookie сеанса с помощью параметра контекста sessionCookiePath, но этого недостаточно для ваших нужд. Я полагаю, что вы можете играть быстро и свободно как с сервером (контейнер сервлетов), так и с браузером с очень небольшим количеством кода.
Короче говоря, напишите фильтр сервлетов, который пропустит запрос без изменений. Когда ответ получен, добавьте свой путь сервлета к пути cookie JSESSIONID и позвольте браузеру отправлять разные JSESSIONID (таким образом, используя другой сеанс) для каждого сервлета.
Вот как это работает:
- Когда запрос приходит в первый раз, он "голый", с ним не связаны никакие файлы cookie. У него нет сессии.
- Сервер создаст один и свяжет
JSESSIONID
к нему и добавить cookie, чтобы позволить клиенту выполнить свою часть отслеживания. - На этом этапе клиент все еще ожидает своего первоначального запроса.
- В фильтре сервлетов (или mod_rewrite) добавьте путь сервлета к пути cookie.
- Отправьте ответ клиенту.
С печеньем, персонализированным для сервлета /dir1
, когда браузер отправит запрос на /dir2
, это также будет "голым", без печенья вообще. Будет создан новый сеанс, фильтр добавит путь к нему и так далее...
С точки зрения сервера, есть два клиента (с одинаковым IP). Один всегда использует /dir1
сервлет, а другой использует только /dir2
сервлет. В этом нет ничего плохого.
Вот одна реализация фильтра, которая может дать старт. Вы также можете рассмотреть возможность сделать это в Apache с mod_headers.
Вопрос в том, почему вы хотите это сделать.
Если это связано с безопасностью, вы должны использовать dir1 и dir2 как разные сервлеты. Разные сервлеты имеют разные сессии, поэтому ваша проблема должна быть решена.
Если это не вариант, и ваша мотивация не имеет ничего общего с безопасностью, вы можете добавить карту для каждого пути к вашей сессии. Затем вам нужно будет сначала получить доступ к вашим объектам сеанса, получив карту для пути, а затем получить доступ к объекту сеанса (то есть ${session.dir1.foo}).
Третье решение может заключаться в использовании фильтра, чтобы скрыть определенные элементы в сеансе для текущего запроса, создав HttpServletRequestWrapper, который возвращает специальный HttpSession для разных запросов.