Подтвердить что ты не робот

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

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

  • Java-интерфейс с Spring и Acegi
  • Работа на Tomcat 5

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

    <% - это плохо: -% > < a href= "page.html" > link </a>

    <% - это хорошо: -% > < a href= "< c: url value = 'page.html'/" > " > link </a>

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

}