Как правильно установить путь cookie JSESSIONID за обратным прокси
Мое веб-приложение работает в Tomcat на http://localhost:8080/example.com/
, но оно обращается проксимированным от Apache, обслуживающим http://example.com/
на порту 80. Мое веб-приложение просматривает заголовок request.getHeader("x-forwarded-host")
, чтобы знать, что он находится за обратный прокси. Когда он обнаруживает это (динамически), он создает URL-адреса без пути сервлета на них.
Это отлично работает для всего, кроме файла cookie JSESSIONID. Он устанавливается с помощью пути /example.com
вместо /
, когда к нему обращаются через обратный прокси. Я не могу понять, как я могу заставить свой код сказать Tomcat, чтобы переопределить путь для этого файла cookie, когда в запросе есть заголовок x-forwarded-host
.
Я попытался самостоятельно установить файл cookie JSESSIONID из веб-приложения, но это приводит к двум заголовкам Set-Cookie, только один из которых правильный.
Ответы
Ответ 1
Tomcat6 использует спецификацию Servlet 2.3. Он не поддерживает изменение пути к файлу cookie с помощью кода или конфигурации Tomcat.
Я получил его для работы со стороны Apache с некоторыми директивами mod_proxy
. Директива ProxyPassReverseCookiePath
делает именно то, что я хочу. Он берет куки из Tomcat с неправильным путем и переписывает его на правильный путь.
<VirtualHost *:*>
Servername example.com
ProxyRequests Off
ProxyPass / http://localhost:8080/example.com/
ProxyPassReverseCookiePath /example.com /
ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
Ответ 2
Альтернативно установите атрибут sessionCookiePath из node/Контекст (файл:/conf/context.xml) на "/":
<Context sessionCookiePath="/">
Посмотрите на http://tomcat.apache.org/tomcat-7.0-doc/config/context.html для получения дополнительной информации
Ответ 3
Версия 3.0 спецификации Servlet представила функциональные возможности для управления файлом cookie сеанса: http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getSessionCookieConfig()
SessionCookieConfig scc = getServletContext().getSessionCookieConfig();
scc.setPath("/");
scc.setDomain("example.com");
Tomcat 7 использует версию 3 спецификации сервлета.