Как установить атрибут 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
.
- для Spring Boot можно выполнить в
@Configuration
см. /questions/38067020/fajl-cookie-togo-zhe-sajta-v-spring-security/55350702#55350702 - для приложения Tomcat - в
context.xml
см. /questions/50263552/kak-ustanovit-samesite-cookie-v-protsessore-pechenya-tomcat/50263561#50263561
Если в 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);
}