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

Как правильно установить путь 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, только один из которых правильный.

4b9b3361

Ответ 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 спецификации сервлета.