Поддержка сеансов без файлов cookie в Tomcat

В настоящее время я запускаю приложение со следующими свойствами:

  • На основе Java с Spring и Acegi
  • Запуск на Tomcat 5

Мне нужна возможность поддерживать сеансы пользователей без файлов cookie. Может кто-нибудь указать мне в правильном направлении.

Спасибо.


person Zakir Hemraj    schedule 12.01.2009    source источник
comment
Разве это не должно работать из коробки на Tomcat? Контейнер сервлета должен установить параметр запроса JSESSIONID при первом использовании сеанса, и если клиент не отправляет ответ, сигнализирующий о том, что он принимает файлы cookie, предполагается, что контейнер будет продолжать использовать этот параметр... я думаю.   -  person matt b    schedule 12.01.2009


Ответы (5)


Полный ответ на этот вопрос представляет собой комбинацию всех ваших ответов, поэтому я подытожу:

  1. Нет необходимости устанавливать cookies="false" в файле context.xml. Идеальной функциональностью для tomcat является использование идентификации сеанса на основе URL-адреса, которая будет использоваться по умолчанию, если файлы cookie не поддерживаются пользователем.

  2. Когда у пользователя не включены файлы cookie, tomcat идентифицирует сеанс по параметру «JSESSIONID» из URL-адреса запроса. Вот несколько примеров URL-адресов: http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 Обратите внимание, что идентификатор сеанса не является частью строки запроса URL-адреса (это стандарт j2ee)

  3. Чтобы обеспечить добавление параметра jsessionid ко всем URL-адресам ваших запросов, у вас не может быть простых ссылок на URL-адреса. Например, в JSTL вы должны использовать ‹ c:url>. Затем механизм сервлета автоматически добавит jsessionid к URL-адресу, если это необходимо. Вот пример:

    ‹%--это плохо:--%> ‹ a href="page.html">ссылка‹ / a>

    ‹%--это хорошо:--%> ‹ a href="‹ c:url value='page.html'/>">ссылка‹ / a>

person Zakir Hemraj    schedule 13.01.2009
comment
Как это сделать, если я использую вызовы ajax? (не href-ссылки) - person maximus; 17.06.2016

См. http://tomcat.apache.org/tomcat-5.5-doc/config/context.html.

В файле META-INF/context.xml,

<?xml version='1.0' encoding='UTF-8'?>
<Context path='/myApplicationContext' cookies='false'>
  <!-- other settings -->
</Context>
person Loki    schedule 12.01.2009
comment
Похоже, что JSESSIONID добавляется к URL-адресу при первом запросе к приложению. Но как я могу гарантировать, что он будет добавлен к последующим запросам? - person Zakir Hemraj; 13.01.2009

Вы можете отслеживать по IP-адресу, но прокси-серверы (и NAT?) могут вас запутать.

Вы можете заставить все URL-адреса иметь сеанс в качестве параметра и все формы в качестве скрытого поля. Возможно, здесь мог бы помочь пользовательский тег для генерации URL-адресов, но я мало работал с библиотеками тегов.

Вам нужно будет подумать о безопасности — люди могут отправлять ссылки кому-то еще с идентификатором сеанса в нем, поэтому вам нужно будет проверять IP-адрес для каждого доступа, чтобы убедиться, что адрес соответствует сеансу.

person JeeBee    schedule 12.01.2009
comment
Я бы рекомендовал никогда не отслеживать по IP-адресу из-за VPN. Этот ответ устарел, поэтому я не буду понижать голос, но я настоятельно не советую это делать будущим искателям ответов. - person abeauchamp; 11.03.2016

Как прокомментировал Мэтт Б, это должно работать из коробки (tomcat попытается использовать файлы cookie, и если это не удастся, вернуться к кодированию сеанса в URL-адресе). Однако это не сработает, если вы создадите «простую» ссылку самостоятельно — всегда используйте метод, подобный JSTL, чтобы tomcat мог добавить параметр отслеживания ко всем URL-адресам.

person Simon Groenewolt    schedule 12.01.2009

Лучше всего использовать перезапись URL . Итак, когда вы используете request.getSession() , container отправит заголовок "Set-Cookie" для session-id в HTTP-ответе, а также session-id, добавленный к URL (но вы должны использовать response.encodeURL(session_info) для перезаписи URL).

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException  {
    resp.setContentType("text/html");
    PrintWriter pw=resp.getWriter();
    HttpSession session=req.getSession();
    pw.println("<html><body>");
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>");
    pw.println("</body></html>");

}
person Prateek Joshi    schedule 02.10.2015