饼干 Java脚本:设置、获取和删除示例

⚡ 智能摘要

饼干 Java脚本会在访问者的计算机上存储小型键值对,以便无状态 HTTP 连接能够记住信息。本文解释了如何设置、读取和删除 cookie,描述了每个 cookie 属性,并将 cookie 与浏览器存储替代方案进行了比较。

  • 🍪 核心定义: cookie 是浏览器保存的一个键值对,并在每个匹配的请求中自动返回。
  • ✍️ 填写 Opera功能: 将值赋给 document.cookie 会一次添加或替换一个 cookie,而不会删除其他 cookie。
  • ???? 了解 Opera功能: 读取 document.cookie 返回一个以分号分隔的字符串,因此必须手动拆分出所需的键值对。
  • 🗑️ 删除 Opera功能: 将过期日期设置为过去某个时间会删除 cookie,并且路径和域名必须与原始值匹配。
  • 🔐 安全属性: Secure 限制传输到 HTTPS,HttpOnly 阻止脚本访问,SameSite 控制跨站点发送。
  • 📏 尺寸限制: 每个 cookie 大约包含 4 KB 的数据,浏览器每个域大约保存 50 个 cookie,因此大型数据应该存储在其他地方。
  • 💾 存储替代方案: localStorage 和 sessionStorage 存储更多数据,并且永远不会附加到网络请求。

饼干 Java脚本

什么是 Cookies?

Cookie 是一小段存储在您电脑上的数据,供您的浏览器访问。您可能已经有意或无意地享受过 Cookie 带来的好处。例如,您是否曾经为了避免每次登录都重新输入个人信息而保持登录状态,比如登录 Facebook?如果是,那么您就使用了 Cookie。Cookie 以键值对的形式保存。

重要说明:Cookie 并不存储您的密码。它存储的是会话标识符,这是服务器在您成功登录后生成的随机令牌。服务器会将该令牌与您的帐户进行匹配,因此密码本身永远不会离开服务器。

为什么需要 Cookie?

之间的沟通 网页浏览器 服务器使用名为 HTTP 的无状态协议进行通信。无状态协议独立处理每个请求,因此服务器在将数据发送给浏览器后不会保留数据。但在许多情况下,用户可能再次需要这些数据。这时,Cookie 就派上了用场。有了 Cookie,浏览器无需每次都与服务器通信,而是可以直接从计算机获取数据。

典型用途包括记住已登录会话、存储语言或主题偏好、保持ping 商店里的物品ping 页面间的购物车,以及首次访问者与回头客的统计。

Javascript 饼干套装

您可以使用 document.cookie 属性创建 cookie,如下所示。

document.cookie = "cookiename=cookievalue"

您甚至可以为 Cookie 设置过期日期,以便在指定日期将 Cookie 从计算机中删除。过期日期应以 UTC/GMT 格式设置。如果您未设置过期日期,则 Cookie 将在用户关闭浏览器时被删除。

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC"

您还可以设置域名和路径,以指定 cookie 所属的域名以及该域名下的哪些目录。默认情况下,cookie 属于设置它的页面。

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC; path=/ "

//创建一个 cookie,其域为当前页面,路径覆盖整个域。

⚠️警告: 过期日期必须在未来。如果过期日期已过,浏览器会立即删除 cookie,这与下文删除部分所使用的技术完全相同。

Java脚本获取 Cookie

你可以像这样访问 cookie,这将返回当前域保存的所有 cookie。

var x =  document.cookie

返回值是一个字符串,格式如下: name1=value1; name2=value2目前没有内置方法可以直接按名称读取单个 cookie,因此必须对字符串进行分割。下面的辅助函数返回单个值,如果 cookie 名称不存在则返回空字符串。

function getCookie(name) {
    const pairs = document.cookie.split(";");
    for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i].trim();
        if (pair.indexOf(name + "=") === 0) {
            // decode in case the value contained spaces or symbols
            return decodeURIComponent(pair.substring(name.length + 1));
        }
    }
    return "";
}

document.cookie = "username=Ann Smith; path=/";
console.log(getCookie("username"));
console.log(getCookie("missing") === "");

输出:

Ann Smith
true

Java脚本删除 Cookie

要删除 cookie,只需将 cookie 的值设置为空,并将 expires 的值设置为已过去的日期即可。

document.cookie = "cookiename= ; expires = Thu, 01 Jan 1970 00:00:00 GMT"

大多数删除失败的原因在于一个细节。浏览器通过 cookie 的名称、路径和域名来识别 cookie,因此删除语句必须使用与创建 cookie 时相同的路径和域名。

// created with an explicit path
document.cookie = "theme=dark; path=/; max-age=2592000";

// deletion must repeat that same path
document.cookie = "theme=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";

// max-age=0 achieves the same result in one shorter line
document.cookie = "theme=; path=/; max-age=0";

Cookie 属性详解

第一个分号之后的每个属性都会改变 cookie 的有效期、哪些请求会携带它以及哪些代码可以读取它。下面的参考资料涵盖了所有这些属性。

属性 目的 例如:
到期 UTC格式的绝对删除日期 expires=Thu, 21 Aug 2031 20:00:00 UTC
最大年龄 从现在开始计算的寿命(以秒为单位)。 最大年龄= 2592000
域内的目录范围 路径=/
主机范围,包括子域名 domain=example.com
安全消息传递 仅通过 HTTPS 连接发送 安全消息传递
HttpOnly 此信息对 document.cookie 隐藏,仅由服务器设置。 HttpOnly
相同网站 控制跨站请求的发送 SameSite=Lax

SameSite 参数值得特别关注,因为浏览器现在会应用默认值。三个可接受的值的行为如下。

  • 严格: 当请求来自其他网站时,永远不会发送 cookie,这是银行会话最安全的设置。
  • 松弛: 该 Cookie 会随顶级导航(例如点击链接)一起传输,但不会随跨站点图像或框架一起传输。这是现代浏览器的默认设置。
  • 没有: 每次跨站请求都会发送 cookie,并且必须与 Secure 属性配对,否则浏览器会拒绝该 cookie。
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡提示: HttpOnly 属性不能从以下位置应用: Java这是脚本设计使然。只有服务器响应头才能设置它,而这正是保护会话 cookie 免受跨站脚本攻击的原因。

亲自尝试一下这个例子

以下脚本结合了这三个操作。它创建一个有效期为天的 cookie,通过名称读取该 cookie,并向再次访问的用户表示欢迎。 要使代码正常运行,请按两次运行按钮。

<html>
<head>
	<title>Cookie!!!</title>
	<script type="text/javascript">
		function createCookie(cookieName,cookieValue,daysToExpire)
        {
          var date = new Date();
          date.setTime(date.getTime()+(daysToExpire*24*60*60*1000));
          document.cookie = cookieName + "=" + cookieValue + "; expires=" + date.toGMTString();
        }
		function accessCookie(cookieName)
        {
          var name = cookieName + "=";
          var allCookieArray = document.cookie.split(';');
          for(var i=0; i<allCookieArray.length; i++)
          {
            var temp = allCookieArray[i].trim();
            if (temp.indexOf(name)==0)
            return temp.substring(name.length,temp.length);
       	  }
        	return "";
        }
		function checkCookie()
        {
          var user = accessCookie("testCookie");
          if (user!="")
        	alert("Welcome Back " + user + "!!!");
          else
          {
            user = prompt("Please enter your name");
            num = prompt("How many days you want to store your name on your computer?");
            if (user!="" && user!=null)
            {
            createCookie("testCookie", user, num);
            }
          }
        }
	</script>
</head>
<body onload="checkCookie()"></body>
</html>

预期行为:

First run  : "Please enter your name"  -> Ann
             "How many days you want to store your name on your computer?" -> 5
Second run : alert box shows  Welcome Back Ann!!!

Code 解释: `createCookie` 函数将天数转换为毫秒,并将其加到当前时间,从而生成过期日期。`accessCookie` 函数以分号分割 cookie 字符串,截取每个片段,并将片段的开头与请求的名称进行比较。`checkCookie` 函数在页面加载时将这两个函数关联起来。

⚠️警告: 该示例使用 toGMTString()这是一个已弃用的别名。新代码应该调用 toUTCString() 相反,因为已弃用的形式最终可能会从浏览器中移除。

Cookies、localStorage 和 sessionStorage

Cookie并非浏览器存储数据的唯一途径。浏览器还提供两种Web存储选项,正确选择可以避免每次请求都发送不必要的字节。

特性 利用Cookies的 本地存储 会话存储
容量 约 4 KB 大约 5 MB 大约 5 MB
已发送至服务器 是的,每次匹配请求都会如此。 没有 没有
终身版 直至到期日 直到明确移除为止 直到标签页关闭为止
服务器可以写入它 没有 没有
可在多个标签页中访问 没有
典型用途 会话和身份验证 偏好设置和缓存数据 单次访问表单状态

实际操作的规则很简单。如果服务器需要该值,则使用 cookie。如果只有页面需要该值,则使用 localStorage 或 sessionStorage,因为这些值不会增加网络请求的权重。

Cookie 处理代码通常在多个页面之间共享,因此请进行审查。 内部和外部 Java脚本 在决定放置位置之前。这里使用的字符串分割方法建立在……之上。 Java脚本字符串Java脚本数组方法并且,更多工作脚本出现在…… 实际 Java脚本代码示例.

常见问题

每个 cookie 大约 4 KB,大多数浏览器为每个域名保存大约 50 个 cookie。更大的值应该存储在 localStorage 中,或者按需从服务器获取。

常见原因包括 Cookie 过期、路径不匹配、页面是从文件系统而非服务器打开的,或者浏览器阻止了 Cookie。请检查开发者工具中的“应用程序”面板。

不。HttpOnly cookie 会刻意对 document.cookie 隐藏,以防止注入的脚本窃取会话令牌。只有服务器才能在请求头中看到它们。

第一方 Cookie 属于地址栏中显示的域名。第三方 Cookie 由嵌入的域名(例如广告商)设置,浏览器现在默认会限制或阻止它们。

是的。通常会使用一个小型 cookie 来存储对话标识符,以便小部件在下次访问时能够恢复之前的对话。消息本身则保存在服务提供商的服务器上。

不。Cookie 会随每个匹配的请求一起传输,除非设置了 HttpOnly 属性,否则脚本可以读取 Cookie。请仅存储不透明的标识符,并将个人数据保存在服务器上。

总结一下这篇文章: