Правильный способ удаления файлов cookie на стороне сервера
, для проверки подлинности, я использую py-bcrypt чтобы создать уникальный токен при входе пользователя в систему и поместить его в файл cookie, который используется для аутентификации.
поэтому я бы отправил что-то вроде этого с сервера:
Set-Cookie: token=a$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
, которая работает на всех браузерах. Затем, чтобы удалить файл cookie, я отправляю аналогичный файл cookie с expires поле установлено на 1 января 1970 года
Set-Cookie: token=a$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
и это прекрасно работает на Firefox, но не удаляет куки на IE или сафари.
Итак, каков наилучший способ удалить файл cookie (желательно без JavaScript)? Набор-в-истекает-в прошлом способ кажется громоздким. А также, почему это работает в FF, но не в IE или Safari?
4 ответов:
отправка одного и того же значения cookie с помощью
; expiresдобавлено не уничтожит куки.недействительным печенья путем установки пустого значения и включают в себя
установка "истекает" на прошлую дату является стандартным способом удаления файла cookie.
ваша проблема, вероятно потому, что формат даты не является обычным. IE, вероятно, ожидает только GMT.
почему бы не установить maxAge печенья
// MaxAge=0 means no 'Max-Age' attribute specified. // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0' // MaxAge>0 means Max-Age attribute present and given in seconds MaxAge int
для реализации GlassFish Jersey JAX-RS я решил эту проблему общим методом, описывающим все общие параметры. Как минимум три параметра должны быть равны: name (="имя"), path (="/ " ) и domain(=null):
public static NewCookie createDomainCookie(String value, int maxAgeInMinutes) { ZonedDateTime time = ZonedDateTime.now().plusMinutes(maxAgeInMinutes); Date expiry = time.toInstant().toEpochMilli(); NewCookie newCookie = new NewCookie("name", value, "/", null, Cookie.DEFAULT_VERSION,null, maxAgeInMinutes*60, expiry, false, false); return newCookie; }и использовать его общий способ установить cookie:
NewCookie domainNewCookie = RsCookieHelper.createDomainCookie(token, 60); Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();и удалить файлы cookie:
NewCookie domainNewCookie = RsCookieHelper.createDomainCookie("", 0); Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();
Comments