Как пометить файлы cookie как безопасные, которые не являются частью сеанса в tomcat

#google-chrome #tomcat #cookies

Вопрос:

В одном из наших приложений у нас есть междоменные файлы cookie, которые не работают в chrome, поскольку эти файлы cookie небезопасны, а также не только HTTP. Этот файл cookie был сгенерирован инструментом, и у нас нет особого контроля над этим.

Мы испробовали несколько способов преодоления этой проблемы.

  1. Попытался установить нижеприведенную конфигурацию в web.xml файл, но он не работает, так как он не был в сеансе.
     <session-config>
         <session-timeout>60</session-timeout>
         <cookie-config>
             <http-only>true</http-only>
             <secure>true</secure>
         </cookie-config>
     </session-config>
     
  2. Попробовал с <CookieProcessor sameSiteCookies="none" /> в context.xml тоже и с другими атрибутами не повезло.

Пожалуйста, найдите прилагаемое изображение для справки.

введите описание изображения здесь

Ответ №1:

<cookie-config> Это относится только к файлу cookie, используемому для установления сеанса ( JSESSIONID по умолчанию).

Если ваши приложения устанавливают файлы cookie без атрибутов secure и httpOnly , вы можете исправить это с помощью Filter :

 public class SecureCookieServletFilter implements Filter {

   private static class SecureCookieResponseWrapper extends HttpServletResponseWrapper {

      public SecureCookieResponseWrapper(HttpServletResponse response) {
         super(response);
      }

      @Override
      public void addCookie(Cookie cookie) {
         cookie.setSecure(true);
         cookie.setHttpOnly(true);
         super.addCookie(cookie);
      }

   }
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
      // NOP
   }

   @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
      final ServletResponse response = res instanceof HttpServletResponse ? new SecureCookieResponseWrapper((HttpServletResponse) res) : res;
      chain.doFilter(req, response);
   }

   @Override
   public void destroy() {
      // NOP
   }

}
 

Конечно, вы можете реализовать ту же логику в обычае CookieProcessor , но это будет сложнее распространять.