获取特定cookie时出现问题

problem in fetching a particular cookie

本文关键字:问题 cookie 获取      更新时间:2023-09-26

这是我用来获取特定cookie 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)我在获取名为lastvisit的cookie时所犯的错误是什么?

;拆分cookie,并将这些令牌与lastvisit进行比较。您需要首先通过=拆分这样一个令牌。allCookies[i]看起来像key=val,永远不会等于lastvisit。即使allCookies[i] == "lastvisit"为真,结果仍然不会像预期的那样,因为您显示的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];

split2参数使sum=1+1=2这样的cookie被正确读取。当通过;分割cookie时,键可能包含一个前导空间,在比较之前要删除它。(/^ +/是一个正则表达式,其中^匹配字符串的开头,+匹配一个或多个空格。)

或者,直接将其与正则比较以匹配可选的空格(*匹配零次或多次空格字符,$匹配字符串的结尾):

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))
}

在比较字符串"lastvisit"之前,您需要删除cookie键周围可能的空白。这是使用正则表达式方便地完成的。/^'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];
    }
    //...
}