关于Cookie

关于Cookie的解说,当登陆界面退出的时候,完全可以通过Cookie来保证登陆名,或者登陆密码来保存起来。当你再次打开网址的时候,就会出现相应的框框里面。

 

但是要注意如何存Cookie  如何取值Cookie。这个貌似要定义方法名字才能取到Cookie

 

var expdate= new Date();

function getCookieVal (offset) {
 var endstr = document.cookie.indexOf (";", offset);
 if (endstr == -1) endstr = document.cookie.length;
 return unescape(document.cookie.substring(offset, endstr));
}

function Cookie (name) {
 var arg = name + "=";
 var alen = arg.length;
 var clen = document.cookie.length;
 var i = 0;
 while (i < clen) {
  var j = i + alen;
  if (document.cookie.substring(i, j) == arg) return getCookieVal (j);
  i = document.cookie.indexOf(" ", i) + 1;
  if (i == 0) break;
 }
 return null;
}

function setCookie (name,value,expires,path,domain,secure) {
 expdate.setTime(expdate.getTime() + (24*60*60*1000*365));
 document.cookie = name + "=" + escape (value) +
 ((expires) ? "; expires=" + expires.toGMTString() : "") +
 ((path) ? "; path=" + path : "") +
 ((domain) ? "; domain=" + domain : "") +
 ((secure) ? "; secure" : "");
}

function deleteCookie(name) {
 expdate = new Date();
 expdate.setTime(expdate.getTime() - (86400 * 1000 * 1));
 setCookie(name, "", expdate);
}

 

<think>我们首先分析题目:关于Cookie,以下说法正确的是: 选项: A. 存储在服务器端 (错误,Cookie是存储在客户端的) B. 每个域名下最多存储20个 (不完全准确,不同浏览器有不同限制,但通常每个域名下Cookie数量是有限制的,比如旧版IE是50个,现代浏览器一般是150个左右,但题目说20个是不对的) C. 不能设置过期时间 (错误,Cookie可以设置过期时间,如果不设置,则默认为会话Cookie,浏览器关闭就消失) D. 默认情况下跨域请求不会携带 (正确,根据同源策略,跨域请求默认不会携带Cookie,除非设置withCredentials为true,且服务器端也设置了允许) 因此,正确答案是D。 但是,为了严谨,我们详细说明一下: A:Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。所以存储在客户端。 B:每个域名下存储Cookie的数量限制因浏览器而异,一般远大于20个(例如,Firefox每个域名最多50个,Chrome和Safari没有硬性限制,但总大小有限制,如每个Cookie不超过4KB,每个域名下所有Cookie的总大小通常不超过4KB左右)。所以20个的说法不准确。 C:Cookie可以设置过期时间,通过设置Expires或Max-Age属性。如果没有设置,则默认为会话Cookie,浏览器关闭即失效。 D:默认情况下,跨域请求(如通过AJAX)不会携带Cookie。如果需要携带,需要设置XMLHttpRequest的withCredentials属性为true,并且服务器需要设置Access-Control-Allow-Credentials为true。 因此,选择D。 但是,题目是单选题,所以选D。 接下来,按照要求,我们需要给出相关的问题。 注意:题目要求回答流程是:回答问题-给出解释。然后最后给出相关问题。 由于题目不是要求写代码,而是选择题,所以我们可以不写代码,但可以解释一下Cookie的相关操作。 为了丰富内容,我们可以给出一个设置Cookie和读取Cookie的示例代码(使用JavaScript),并解释。 然后按照格式提出相关问题。 回答: 关于Cookie,以下说法正确的是:D 解释: - A选项:Cookie存储在客户端(浏览器),而不是服务器端。 - B选项:每个域名下存储的Cookie数量限制并不是20个,不同浏览器有不同限制,但通常都大于20(例如,现代浏览器一般支持每个域名至少50个以上)。 - C选项:Cookie可以设置过期时间,通过设置`expires`或`max-age`属性。 - D选项:默认情况下,跨域请求(如AJAX请求)不会携带Cookie,需要显式设置请求的credentials为include(或使用fetch时设置credentials: 'include')或XMLHttpRequest的withCredentials为true。 示例代码:设置和读取Cookie(JavaScript) 设置Cookie: ```javascript // 设置一个名为"username"的Cookie,值为"John Doe",过期时间为7天后 function setCookie(name, value, days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (value || "") + expires + "; path=/"; } // 调用 setCookie("username", "John Doe", 7); ``` 读取Cookie: ```javascript function getCookie(name) { var nameEQ = name + "="; 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, c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; } // 调用 var username = getCookie("username"); console.log(username); ``` 删除Cookie(通过设置过期时间为过去): ```javascript function eraseCookie(name) { document.cookie = name + '=; Max-Age=-99999999; path=/'; } ``` 上述代码中: - setCookie函数用于设置Cookie,可以指定过期天数。 - getCookie函数用于读取指定名称的Cookie值。 - eraseCookie函数用于删除指定名称的Cookie。 §§相关问题§§: 1. Cookie和Session的区别是什么? 2. 如何设置HttpOnly和Secure属性的Cookie? 3. 在哪些情况下浏览器会发送Cookie? 4. 如何防止Cookie被窃取?</think>关于Cookie,以下说法正确的是:**D. 默认情况下跨域请求不会携带**。 ### 解释: 1. **A. 存储在服务器端** ❌ Cookie 是存储在**客户端**(浏览器)的数据,服务器通过 `Set-Cookie` 响应头将 Cookie 发送给浏览器保存,后续请求由浏览器自动附加到请求头中。 2. **B. 每个域名下最多存储20个** ❌ 不同浏览器对 Cookie 的数量限制不同(通常为 **50个左右**),且总大小限制约为 **4KB/域名**(所有 Cookie 的总和)。20个的说法不准确。 3. **C. 不能设置过期时间** ❌ Cookie 可通过 `Expires` 或 `Max-Age` 属性设置过期时间。未设置时默认为会话 Cookie(关闭浏览器后失效)。 4. **D. 默认情况下跨域请求不会携带** ✅ 出于安全考虑(同源策略),浏览器默认**不会**在跨域请求(如 AJAX 请求不同域名的 API)中发送 Cookie。需显式设置 `withCredentials: true`(前端)并配置服务端 CORS 响应头(如 `Access-Control-Allow-Credentials: true`)。 --- ### 示例代码:JavaScript 操作 Cookie ```javascript // 设置 Cookie(含过期时间) document.cookie = "username=John; expires=Fri, 31 Dec 2024 12:00:00 UTC; path=/"; // 读取 Cookie function getCookie(name) { const cookies = document.cookie.split(';'); for (let cookie of cookies) { const [key, value] = cookie.trim().split('='); if (key === name) return decodeURIComponent(value); } return null; } console.log(getCookie("username")); // 输出 "John" // 跨域请求携带 Cookie(需服务端配合) fetch("https://api.other-domain.com/data", { method: "GET", credentials: "include" // 强制发送 Cookie }); ``` --- ### Cookie 关键特性总结: | 特性 | 说明 | |--------------|----------------------------------------------------------------------| | 存储位置 | 客户端(浏览器) | | 数量限制 | 约 50 个/域名(不同浏览器有差异) | | 大小限制 | 约 4KB/域名(所有 Cookie 总和) | | 过期时间 | 通过 `Expires` 或 `Max-Age` 设置,不设置则为会话 Cookie | | 安全属性 | `Secure`(仅 HTTPS 发送)、`HttpOnly`(禁止 JavaScript 访问) | | 跨域行为 | 默认不携带,需手动启用并配置 CORS |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值