Мы используем графическую систему, которая использует SNMP для извлечения данных на график с каждыми пятью минутами. Например, 12:00, 12:05, 12:10 и т. Д. Мы извлекаем график как изображение. Проблема в том, что браузеру нравится использовать кэшированное изображение, и мы не можем получить новое изображение, пока мы не удалим кеш. То, что я пытаюсь сделать, это создать случайный тег для добавления к изображению, что делает его уникальным, поэтому не использует кешированное изображение. Мы могли генерировать случайный тег каждый раз, когда изображение было восстановлено, но это привело к большому количеству использования сервера из всех запросов и более медленному времени отклика. То, что я пытаюсь сделать сейчас, - это генерировать новый тег ТОЛЬКО, если:Обнаружение пятиминутного знака
а) он был больше четырех минут (5+), так как пользователь получил изображение (потому что нужно было пройти пять минут) ,
b) прошло менее пяти минут с момента получения изображения, но с момента последнего получения изображения прошло пять минут. Например, если человек получает изображение в 12:04, он или она не сможет получить новый до пяти минут позже с первым тестом, но второй тест признает, что 12:05 прошло, если он или она пытается получить изображение в 12:06.
Что я пытался сделать, это использовать файл cookie и устанавливать cookie в новый тег каждый раз, когда генерируется новый тег. При загрузке страницы загружалась бы переменная RandomTag со значением cookie. Onclick было бы определено, прошло ли пять минут со времени в переменной RandomTag или если прошло пять минут с момента последнего поколения тега, сгенерируйте новый тег, если он есть, и установите cookie с новым тегом; в противном случае тег не изменится.
Может ли кто-нибудь проверить это и посмотреть, есть ли какие-либо проблемы? Я пробовал этот код, и это заставило мою страницу зависать. Я не знаю, чего мне не хватает. Кроме того, если у вас есть более простой способ сделать это, пожалуйста, дайте мне знать.
Вот пример моего кода:
<body onload="checkCookie()">
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
}
return "";
}
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
function checkCookie() {
randomTag = getCookie("timeTag");
}
function tagGet() {
timeNow = new Date().getTime();
timeDif = timeNow - randomTag;
minNow = timeNow.getMinutes();
minLast = randomTag.getMinutes();
minDif = minNow - minLast;
if (timeDif > 29999) { //If 5+ minutes have passed
randomTag = timeNow;
setCookie("timeTag", timeNow, 365);
}
else if (timeDif < 30000) { //If less than 5 minutes have passed
if (minDif > 0) { //If at least 1 minute has passed since last random tag generation
for (y = 0; y < minDif; y++) { //Check to see if a five minute mark has passed by decrementing the current minute mark and comparing it to a five minute mark
for (z = 0; z < 60; z += 5) { //Increment by five minute marks for comparison ... 0, 5, 10, etc
if (minNow == z) { //If the minute mark now matches a five minute mark
randomTag = timeNow;
setCookie("timeTag", timeNow, 365);
}
minNow--; //Decrement minute mark now for comparing next minute mark
}
}
}
}
}
<a href="#" onClick="tagGet()">#</a> //This is generic
не является прямым ответом на ваш вопрос js, но перехват кеша обычно выполняется на стороне сервера ... какой стек вы используете на своем сервере? Я думаю о чем-то подобном (я являюсь пользователем hapi js): https://github.com/poeticninja/hapi-cache-buster – tgo
tgo, к сожалению, у меня нет доступа к серверу, поэтому я должен использовать логику на клиенте side – nicholasm5581
То, что я думал о том, чтобы сделать, было, на загрузке страницы, найти последнюю пятиминутную отметку, сгенерировать тег, а затем запустить таймер, который генерирует новый тег каждые пять минут. Я просто думаю, что будет более интенсивно иметь текущий таймер, чем запустить функцию при нажатии. – nicholasm5581