Поддержка сессий без файлов cookie в Tomcat
В настоящее время я запускаю приложение со следующими свойствами:
- Java-интерфейс с Spring и Acegi
- Работа на Tomcat 5
Мне нужна возможность поддерживать сеансы пользователя без. Может кто-нибудь, пожалуйста, назовите меня в правильном направлении.
Спасибо.
Ответы
Ответ 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¶m2=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>
Ответ 2
См. 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>
Ответ 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>");
}