Установка httponly в cookie JSESSIONID (Java EE 5)
Я пытаюсь установить флаг httponly в cookie JSESSIONID. Однако я работаю в Java EE 5 и не могу использовать setHttpOnly()
. Сначала я попытался создать свой собственный JSESSIONID файл cookie из сервлета doPost()
с помощью response.setHeader()
.
Если это не сработало, я попробовал response.addHeader()
. Это тоже не сработало. Затем я узнал, что сервлет обрабатывает преобразование сеанса в файл cookie JSESSIONID и вставляет его в заголовок http, поэтому, если я хочу играть с этим куки файлом, мне придется написать фильтр. Я написал фильтр и играл с setHeader()
/addHeader()
там, снова безрезультатно.
Затем я узнал, что в объекте ответа происходит некоторое действие flush/close, прежде чем он попадет в фильтр, поэтому, если я хочу манипулировать данными, мне нужно расширить HttpServletResponseWrapper
и передать это на filterChain.doFilter()
. Это сделано, но я до сих пор не получаю результатов. Ясно, что я делаю что-то неправильно, но я не знаю, что.
Я не уверен, что это имеет отношение к рассматриваемому вопросу, но ни один html-документ не возвращается сервлетом в браузер. Все, что происходит на самом деле, заключается в том, что некоторые объекты заполняются и возвращаются в JSP-документ. Я предположил, что объект Session превращается в файл cookie JSESSIONID и завернут - вместе с объектами, добавленными в запрос, - в HTTP-заголовке перед отправкой в браузер.
Я был бы рад опубликовать некоторый код, но я хочу исключить возможность того, что мои трудности связаны с неправильным пониманием теории.
Ответы
Ответ 1
Так как cookie JSESSIONID
управляется сервером servletcontainer, этот параметр является специфичным для servletcontainer. Непонятно, какой из них вы используете, поэтому здесь Apache Tomcat 6.0 настроен так, чтобы вы знали, в каком направлении вам придется искать ваш servletcontainer: вам нужно установить атрибут useHttpOnly
элемента webapplication <Context>
на true
.
<Context useHttpOnly="true">
...
</Context>
Также смотрите документацию Tomcat о элементе <Context>
.
Ответ 2
Вы можете использовать это с Java EE 5:
Для версий Java Enterprise Edition до Java EE 6 общим обходным решением является перезапись заголовка ответа HTTP SET-COOKIE с параметром cookie сеанса, который явно добавляет флаг HttpOnly:
String sessionid = request.getSession().getId();
// be careful overwriting: JSESSIONID may have been set with other flags
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
Источник: https://www.owasp.org/index.php/HttpOnly
Я тестирую его в фильтр