Управление сессиями Tomcat - независимая сессия на одном хосте

У меня есть простой JSP-сайт на Tomcat. Для работы с сессией я использую простой jsp session объект.

Но мне нужна изоляция некоторых сессий в моих веб-каталогах.

mysite.com/dir1 
mysite.com/dir2

Я хочу использовать независимые сессии для каждого dir1 а также dir2

Это возможно с минимальной коррекцией jsp-кода и без использования виртуальных хостов?

2 ответа

Tomcat предлагает некоторый контроль над путем cookie cookie сеанса с помощью параметра контекста sessionCookiePath, но этого недостаточно для ваших нужд. Я полагаю, что вы можете играть быстро и свободно как с сервером (контейнер сервлетов), так и с браузером с очень небольшим количеством кода.

Короче говоря, напишите фильтр сервлетов, который пропустит запрос без изменений. Когда ответ получен, добавьте свой путь сервлета к пути cookie JSESSIONID и позвольте браузеру отправлять разные JSESSIONID (таким образом, используя другой сеанс) для каждого сервлета.

Вот как это работает:

  1. Когда запрос приходит в первый раз, он "голый", с ним не связаны никакие файлы cookie. У него нет сессии.
  2. Сервер создаст один и свяжет JSESSIONID к нему и добавить cookie, чтобы позволить клиенту выполнить свою часть отслеживания.
  3. На этом этапе клиент все еще ожидает своего первоначального запроса.
  4. В фильтре сервлетов (или mod_rewrite) добавьте путь сервлета к пути cookie.
  5. Отправьте ответ клиенту.

С печеньем, персонализированным для сервлета /dir1, когда браузер отправит запрос на /dir2, это также будет "голым", без печенья вообще. Будет создан новый сеанс, фильтр добавит путь к нему и так далее...

С точки зрения сервера, есть два клиента (с одинаковым IP). Один всегда использует /dir1 сервлет, а другой использует только /dir2 сервлет. В этом нет ничего плохого.

Вот одна реализация фильтра, которая может дать старт. Вы также можете рассмотреть возможность сделать это в Apache с mod_headers.

Вопрос в том, почему вы хотите это сделать.

Если это связано с безопасностью, вы должны использовать dir1 и dir2 как разные сервлеты. Разные сервлеты имеют разные сессии, поэтому ваша проблема должна быть решена.

Если это не вариант, и ваша мотивация не имеет ничего общего с безопасностью, вы можете добавить карту для каждого пути к вашей сессии. Затем вам нужно будет сначала получить доступ к вашим объектам сеанса, получив карту для пути, а затем получить доступ к объекту сеанса (то есть ${session.dir1.foo}).

Третье решение может заключаться в использовании фильтра, чтобы скрыть определенные элементы в сеансе для текущего запроса, создав HttpServletRequestWrapper, который возвращает специальный HttpSession для разных запросов.

Другие вопросы по тегам