Можно ли прочитать дату истечения срока действия cookie с помощью JavaScript?
Если да, то как? Если нет, есть ли источник, на который я могу смотреть?
Можно ли прочитать дату истечения срока действия cookie с помощью JavaScript?
Если да, то как? Если нет, есть ли источник, на который я могу смотреть?
Невозможно получить дату истечения срока действия cookie через Javascript; только пары ключ-значение отображаются через document.cookie
.
Если вы используете Chrome, вы можете перейти на вкладку "Приложение" (в разделе "Инструменты разработчика" ) и найти элемент "Cookies" на левой боковой панели. Оттуда выберите домен, на который вы проверяете установленный файл cookie, и он предоставит вам список файлов cookie, связанных с этим доменом, и дату их истечения.
Есть некоторые, кто найдет это спорным, но одно решение - создать еще один файл cookie в одно и то же время и сохранить время/штамп в нем параллельно с тем, какой был создан оригинальный файл cookie. Обновляйте их одновременно и таким образом вы можете легко получить время из своего нового файла cookie (альтернативно добавьте время/штамп в исходный файл cookie).
Причина, по которой это было бы спорным, заключается в том, что на протяжении многих лет идея хранения файлов cookie на ПК пользователей не пользуется популярностью, потому что вы занимаете свое место. Тем не менее, я действительно сомневаюсь, что небольшое временное печенье будет слишком ужасающим.
Стоит помнить, что если прошло время, браузер не сообщит о том, что этот файл cookie доступен. В браузере может отображаться файл cookie, но когда JS пытается получить к нему доступ - он тоже не сможет.
Кроме того, я обнаружил, что панель инструментов WebDeveloper в Firefox показывает файлы cookie, которые прошли, но в Firefox > Настройки конфиденциальности они обновлены правильно.
Другой способ сделать это - записать дату истечения срока действия в куки файла cookie, а затем перечитать его оттуда для последующих переписываний. Я получил это, чтобы работать с фантастической библиотекой js-cookies.
Настройка выглядит следующим образом:
// Set cookie expiration as a number (of days)
var paywallDuration = 30;
// When you set the cookie, add the `expires` key/value pair for browsers
// Also add `expirationDate` key/value pair into JSON object
Cookies.set('article-tracker', {
expirationDate : paywallDuration,
totalArticlesRead: 1
}, {
expires : paywallDuration,
domain : 'example.com'
});
Чтение вашего файла cookie и перезаписи осуществляется с помощью этого метода. Используйте метод js-cookie getJSON()
для чтения установленной даты истечения срока действия. Затем используйте эту дату дважды, когда вы переписываете свой файл cookie - снова в объекте JSON, а затем для браузера с expires
:
var existingPaywallDuration = Cookies.getJSON('article-tracker').expirationDate;
Cookies.set('article-tracker', {
expirationDate: existingPaywallDuration,
totalArticlesRead: 4
}, {
expires : existingPaywallDuration,
domain : 'example.com'
});
Если у вас есть контроль над кодом, в котором установлен файл cookie, вы можете добавить код, чтобы сохранить дату истечения срока действия в локальном хранилище браузера для последующего извлечения. Например:
// set cookie with key and value to expire 30 days from now
var expires = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
document.cookie = [
"key=value",
"expires=" + expires.toUTCString()
].join("; ");
// store cookie expiration date for key in local storage
if (window.localStorage) {
localStorage.setItem("keyExpires", expires.toISOString());
}
Позже вы можете искать, когда срок действия файла cookie истекает в локальном хранилище. Например:
var expires = localStorage.getItem("keyExpires");
Локальное хранилище в настоящее время имеет широкую поддержку.
Существует обходной вопрос для OP, если вы также контролируете настройку файлов cookie. Я делаю это так:
function setCookie(name, value, expiryInDays) {
const d = new Date();
d.setTime(d.getTime() + expiryInDays * 24 * 60 * 60 * 1000);
document.cookie = '${name}=${value}_${d.toUTCString()};expires=${d.toUTCString()}';
}
function showCookies() {
if (document.cookie.length !== 0) {
const allCookies = document.cookie.split(/;\s*/);
const wrapper = document.getElementById('allCookies');
wrapper.innerHTML = allCookies.reduce((html, cookie, index) => {
const cookieParts = cookie.split('=');
const cookieValueParts = cookieParts[1].split('_');
const cookieHtml = [
'<b>${index + 1}</b>',
'Cookie name: ${cookieParts[0]}',
'Cookie value: ${cookieValueParts[0]}',
'Expires: ${cookieValueParts[1] || 'unknown'}'
].join('<br>');
return html + '<p>${cookieHtml}</p>';
}, '');
}
}
<button onclick="showCookies()">Show me the cookies!</button>
<div id="allCookies"></div>