Как установить атрибут SameSite?

У меня проблема с установкой атрибута SameSite в Cookie. Я хотел установить этот атрибут, но ни javax.servlet.http.Cookie ни java.net.HttpCookie предоставить способ справиться с этим. Поэтому у меня есть идея создать ответ javax.servlet.Filter которые ловят заголовок "Set-Cookie" и добавляют атрибут "SameSite=Strict".

response.setHeader("Set-Cookie", response.getHeader("Set-Cookie") + "; SameSite=strict");

Это работает нормально, но проблема появляется, когда у меня есть более одного заголовка "Set-Cookie" в одном ответе. javax.servlet.http.HttpServletResponse не предоставляет метод для удаления или перезаписи более одного хедера с одним и тем же именем (итерация по ним и использование setHeader() не работает, потому что всегда устанавливает последний). У вас есть идеи, как установить атрибут SameSite в cookie или как перезаписать заголовки в фильтре ответов?

Заранее спасибо.

4 ответа

Решение

Оказывается, используя setHeader() метод удалить все предыдущие заголовки с тем же именем, поэтому я просто создаю простой цикл в doFilter() метод. Он добавляет атрибут SameSite=Strict к каждому установленному файлу cookie.

    boolean firstHeader = true;
    for (String header : cookiesHeaders) {
        if (firstHeader) {
            httpResponse.setHeader("Set-Cookie", String.format("%s; %s", header, "SameSite=Strict"));
            firstHeader = false;
            continue;
        }
        httpResponse.addHeader("Set-Cookie", String.format("%s; %s", header, "SameSite=Strict"));
    }

В etc/apache2/httpd.conf

Правка заголовка Set-Cookie ^(.*) $1;SameSite=Strict


работает на меня.....

Новый Tomcat поддерживает файлы cookie SameSite через TomcatContextCustomizer.

Если в javax все еще нет реализации Samesite, вы можете попробовать расширить класс Cookie и использовать библиотеку cookie, в которой уже есть реализация Samesite. В моем случае это был класс Springframework ResponseCookie.

Вот расширенный класс

      public class SamesiteHttpServletResponse extends HttpServletResponseWrapper
{

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

  @Override
  public void addCookie(Cookie cookie)
  {

    ResponseCookie responseCookie = ResponseCookie
      .from(cookie.getName(), cookie.getValue())
      .secure(true)
      .httpOnly(true)
      .path(cookie.getPath())
      .maxAge(cookie.getMaxAge())
      .sameSite("Lax")
      .build();

      this.addHeader(HttpHeaders.SET_COOKIE, responseCookie.toString());
  }

  }

Затем используйте этот класс, предоставив HttpServletResponse и добавив файлы cookie в этот ответ. Например:

      public void exampleMethod(HttpServletResponse res){

HttpServletResponse response = new SamesiteHttpServletResponse(res); 

// create or get a hold of the javax Cookie you want to add the samesite to

response.addCookie(mycookie); 

}
Другие вопросы по тегам