Удаляем кукисы, время жизни которых более заданного
Задача: есть сайт, на котором кукисы устанавливаются движком. Где не известно. Настроек нет (или есть, но лень-не кому копаться). Необходимо принудительно сократить время жизни куков до заданного.
Решение:
Из сложных нюансов: браузер не позволяет читать время истечения жизни (и путь) установленных кукисов. От слова никак и вообще. Защита такая..
Ну если с путем всё в принципе не так важно — просто вставлять код трущий кукисы на КАЖДОЙ странице, а не только на «начальной», то кукисы прочитаются, то со временем жизни возможен только «хук». А именно: читаем все куки. Записываем все ключи куков в локасторадж браузера с датой истечения сегодня+(какое-то количество дней). При следующем открытии страницы — проверяем дату истечения в сторадже. Если меньше текущей — трем кукисы.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
dayssavecookies=7; function deleteLCookie(name) { document.cookie.split(";").forEach(function(el) { if(!el.indexOf(name)) { var date = new Date(0); document.cookie = el + "=; path=/; expires=" + date.toUTCString(); } }); } function getAllCookies(){ var pairs = document.cookie.split(";"); var cookies = {}; for (var i=0; i<pairs.length; i++){ var pair = pairs[i].split("="); cookies[(pair[0]+'').trim()] = unescape(pair.slice(1).join('=')); } return cookies; } // получаю текущие куки браузера cooks_values=getAllCookies(); // получаю текущие сохраненные в сторадже куки - даты if (localStorage["cooks_dates"]==undefined){ ls_dates=new Map(); } else { ls_dates=JSON.parse(localStorage["cooks_dates"]) }; // если кука в сторадже нет, то добавляю, если истек - ту удаляю и из стораджа и из куков for (key in cooks_values) { console.log(key); console.log(cooks_values[key]); // если новый кук - добавляем if (ls_dates[key]==undefined){ console.log("--add to localstorage"); datec = new Date(Date.now() + 86400e3*dayssavecookies); ls_dates[key]=datec; }; // если кук истек в локальном хранилище - трём его в куках и в локальном хранилище if (new Date(ls_dates[key])<Date.now()){ delete(ls_dates[key]); deleteLCookie(key); }; } localStorage.setItem("cooks_dates", JSON.stringify(ls_dates)); |