Поддержка сеансов без файлов cookie в Tomcat - PullRequest
13 голосов
/ 12 января 2009

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

  • на основе Java с Spring и Acegi
  • Работает на Tomcat 5

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

Спасибо.

Ответы [ 5 ]

20 голосов
/ 14 января 2009

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

  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 вы должны использовать . Затем движок сервлета автоматически добавит jsessionid в URL, если это необходимо. Вот пример:

    <% - это плохо: -%> ссылка

    <% - это хорошо: -%> "> ссылка

4 голосов
/ 12 января 2009

См. 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>
0 голосов
/ 02 октября 2015

Лучше всего использовать перезапись 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>");

}
0 голосов
/ 13 января 2009

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

0 голосов
/ 12 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...