Назад | Перейти на главную страницу

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

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

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

mysite.com/dir1 
mysite.com/dir2

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

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

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

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

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

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

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

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

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

Вопрос в том, зачем вам это нужно.

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

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

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