Установка 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

Я тестирую его в фильтр