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