проблема в получении определенного куки - PullRequest
0 голосов
/ 24 сентября 2011

Это скрипт, который я использую для извлечения определенного куки lastvisit:

ПОСЛЕ РЕДАКТИРОВАНИЯ

// This document writes a cookie
// called from index.php
window.onload = makeLastVisitCookie;

function makeLastVisitCookie() {
var now = new Date();
var last = new Date();
now.setFullYear(2020);
// set the cookie
document.cookie = "lastvisit=" + last.toDateString() + ";path=/;expires=" + now.toGMTString();
var allCookies = document.cookie.split(";");
for( var i=0 ; i < allCookies.length ; i++ ) {
    if(allCookies[i].split("=")[0]== "lastvisit") {
        document.getElementById("last_visit").innerHTML = "You visited this site on" + allCookies[i].split("=")[1];
    } else {
                alert("testing..testing..");
              }
  }
 }

Из этого сценария часть if никогда не работает, хотя на моем веб-сайте хранится 5 файлов cookie. (включая файл cookie, который я сохраняю из этого сценария) Какую ошибку я совершаю при получении файла cookie с именем lastvisit?

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Вы разделяете cookie на ;, сравнивая эти токены с lastvisit. Вы должны сначала разделить такой токен на =. allCookies[i] выглядит как key=val и никогда не будет равно lastvisit. Если значение allCookies[i] == "lastvisit" равно true, результат все равно будет не таким, как ожидалось, поскольку вы показываете значение allCookies[i + 1], которое будет this=the_cookie_after_lastvisit.

if(allCookies[i].split("=") == "lastvisit") { должно быть:

var pair = allCookies[i].split("=", 2);
if (pair[0].replace(/^ +/, "") == "lastvisit") {

"You visited this site on" + allCookies[i+1]; должно быть:

"You visited this site on" + pair[1];

Аргумент 2, равный split, позволяет правильно читать файлы cookie, такие как sum=1+1=2. При разбиении файлов cookie на ; ключ может содержать начальный пробел, который перед удалением может быть удален. (/^ +/ - регулярное выражение, где ^ соответствует началу строки и + один или несколько пробелов.)

В качестве альтернативы, сравните его непосредственно с RE для сопоставления необязательных пробелов (* соответствует нулю или большему числу вхождений пробела, $ соответствует концу строки):

if (/^ *lastvisit$/.test(pair[0])) {

Я протестировал несколько способов получения файлов cookie, в том числе с помощью регулярных выражений, и приведенный ниже был наиболее правильным и показал лучшую производительность:

function getCookie(name) {
    var cookie = "; " + document.cookie + ";";
    var search = "; " + encodeURIComponent(name) + "=";
    var value_start = cookie.indexOf(search);
    if (value_start == -1) return "";
    value_start += search.length;
    var value_end = cookie.indexOf(';', value_start);
    return decodeURIComponent(cookie.substring(value_start, value_end))
}
0 голосов
/ 24 сентября 2011

Вам необходимо удалить возможные пробелы вокруг ключа cookie перед сравнением со строкой "lastvisit". Это удобно делать с помощью регулярных выражений. /^\s+/ соответствует всему пробелу в начале, /\s+$/ соответствует всему пробелу в конце. Соответствия заменяются пустой строкой, т.е. удаляются:

for( var i = 0 ; i < allCookies.length ; i++ ) {
    var c = allCookies[i].split("="); // split only once
    var key = c[0].replace(/^\s+/, '').replace (/\s+$/, ''); // remove blanks around key
    if (key == "lastvisit") {
        document.getElementById("last_visit").innerHTML = "You visited on " + c[1];
    }
    //...
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...