会话COOKIE? 持久COOKIE?

本文深入探讨了COOKIE与SESSION的工作原理及关系,解析了会话COOKIE和持久COOKIE的概念,通过实战测试验证了两者并无本质区别,均为javax.servlet.http.Cookie类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于COOKIE和SESSION的关系,一直没搞清楚。网上一搜COOKIE,普遍都有会话COOKIE和持久COOKIE的概念。

rubyeye的博客里有这样的解释,我把部分贴过来。(http://rubyeye.iteye.com/blog/196117)

引用
当浏览器得到这个sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就是URL重写只能实现会话cookie的效果,持久会话实现不了.


刚开始理解时,我也认为会有持久和会话这两种COOKIE。我认为,
会话COOKIE就是用来存放SESSIONID的,并且只存在于浏览器内存,浏览器关闭后会话COOKIE就被删除;
持久COOKIE就是用来存放其它信息,并且是在我们的本地硬盘里能看到的那种COOKIE。

然后我写了个SERVLET试了一下。
Java代码 收藏代码
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {  

Cookie cookie = null;

PrintWriter out = response.getWriter();
out.println("<html><body>");

Cookie[] cookies = request.getCookies();

// 如果没有COOKIE,新建一个COOKIE
if (cookies == null) {

out.println("<b>cookies is null.</b></br>");

cookie = new Cookie("new", "1");

response.addCookie(cookie);

} else {

out.println("<b>cookies is not null.</b></br>");

for (int i = 0; i < cookies.length; i++) {

cookie = cookies[i];

out.println("cookie" + i + " name: " + cookie.getName() + "</br>");
}
}

HttpSession session = request.getSession();

if (session == null) {
out.println("<b>session is null.</b></br>");

} else {
out.println("<b>session is not null.</b></br>");
out.println("session id: " + session.getId() + "</br>");
}

out.println("</body></html>");
}



第一次访问这个SERVLET,页面显示
引用
cookies is null.
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


第二次访问,页面显示
引用
cookies is not null.
cookie0 name: new
cookie1 name: JSESSIONID
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


第二次访问时从客户端来了两个COOKIE,名为“new”的COOKIE是我创建的,名为“JSESSIONID”的COOKIE应该是服务器TOMCAT创建的,但这时,在本地硬盘里找不到这两个COOKIE的文件。

改一下SERVLET,在创建名为“new”的COOKIE时,加一句
Java代码 收藏代码
cookie.setMaxAge(1000);

然后本地硬盘里就有“new”这个COOKIE了。

这下就有疑问了,在没有设置COOKIE存活期时,自己创建的SESSION不会存到本地硬盘,会不会TOMCAT创建的所谓的会话COOKIE也是没有设置存活期呢?

然后根据zddava的博客(http://zddava.iteye.com/blog/311053),找到了TOMCAT里创建会话COOKIE的代码。

org.apache.catalina.connector.Request.java里,
Java代码 收藏代码
protected void configureSessionCookie(Cookie cookie) {  
cookie.setMaxAge(-1);
String contextPath = null;
if (!connector.getEmptySessionPath() && (getContext() != null)) {
contextPath = getContext().getEncodedPath();
}
if ((contextPath != null) && (contextPath.length() > 0)) {
cookie.setPath(contextPath);
} else {
cookie.setPath("/");
}
if (isSecure()) {
cookie.setSecure(true);
}
}


cookie.setMaxAge(-1);使COOKIE在浏览器被关闭时删除。而且这里的cookie和上面SERVLET里的cookie都是javax.servlet.http.Cookie。

由此得出结论,可能最开始是我理解错了,COOKIE并没有会话COOKIE和持久COOKIE之分。我们本地创建的“持久COOKIE”和WEB容器创建的“会话COOKIE”都是一种COOKIE,就是javax.servlet.http.Cookie。只是WEB容器把存活期设置成了关闭浏览器时删除而已(TOMCAT)。
<think>我们正在讨论的是Cookie的基本概念及其在Web开发中的作用。根据引用内容,我们可以总结如下:引用[1]中提到:Cookie是一小段存储在浏览器(客户端)的文本信息。它由服务器在HTTP响应的Set-Cookie头部中发送给浏览器,并被客户端保存,并在后续的HTTP请求中发送回服务器。通常情况下,它被用来跟踪用户的状态、记录用户的偏好和实现购物车等功能。引用[2]指出:CookieSession会话技术的核心,在B/S架构中,为了保存浏览器和服务器交互的数据(因为HTTP协议是无状态的)而产生了CookieSession技术。其中Cookie信息保存在浏览器中。引用[3]提到:Cookie就像网站和浏览器之间的信使,帮助网站记住你的信息,提供更加个性化的服务。引用[5]补充:cookie扮演着重要的角色用于在客户端存储和传递小型数据,常见于会话管理、用户认证以及个性化设置等场景。因此,我们可以这样回答:###什么是CookieCookie(中文常译为“小型文本文件”或“曲奇”)是由Web服务器发送到用户浏览器并保存在本地的一小段文本数据(通常不超过4KB)。浏览器会存储这些数据,并在后续向同一服务器发起的请求中携带该数据。Cookie是HTTP协议中用于实现会话状态管理的一种机制。###Cookie在Web开发中的作用1.**会话管理**:保持用户登录状态(例如,用户登录后,服务器发送一个包含会话ID的Cookie浏览器在后续请求中携带该Cookie,服务器即可识别用户身份)[^1][^2]。2.**个性化设置**:存储用户偏好(如语言、主题等),实现定制化服务[^3]。3.**用户行为跟踪**:记录用户浏览行为(常用于广告推荐、网站分析)[^1]。4.**购物车功能**:在电商网站中暂存用户选择的商品信息[^1][^2]。###Cookie的工作原理1.**创建**:服务器通过HTTP响应的`Set-Cookie`头部发送Cookie信息到浏览器。```httpHTTP/1.1200OKSet-Cookie:user_id=12345;Max-Age=3600;Secure;HttpOnly```2.**存储**:浏览器Cookie保存到本地(内存或硬盘)。3.**发送**:后续请求同一域名时,浏览器自动在`Cookie`头部附加存储的Cookie。```httpGET/profileHTTP/1.1Cookie:user_id=12345```###安全注意事项-**敏感信息**:避免在Cookie中直接存储密码等敏感数据[^3]。-**安全属性**:建议设置`Secure`(仅HTTPS传输)、`HttpOnly`(禁止JavaScript访问)和`SameSite`(防范CSRF攻击)[^3][^5]。###示例:JavaScript操作Cookie前端可通过`document.cookie`读写Cookie(需注意同源策略):```javascript//设置Cookiedocument.cookie="theme=dark;path=/;max-age=86400";//读取所有Cookieconstcookies=document.cookie;//返回"theme=dark;user_id=12345"```###相关问题1.CookieSession的主要区别是什么?2.如何设置Cookie的有效期?3.如何防止Cookie被窃取?4.Cookie在跨域请求中的行为是怎样的?[^1]:Cookie:HTTP会话管理的基础[^2]:CookieSession会话技术的核心[^3]:JavaWeb之Cookie详解[^5]:前端必备技能:全面解析Cookie在Web开发中的应用</think>### 什么是 CookieCookie(中文常译为"小型文本文件")是由 Web 服务器发送到用户浏览器并保存在本地的一小段文本数据(通常不超过 4KB)。浏览器会存储这些数据,并在后续向同一服务器发起的请求中携带该数据。Cookie 是 HTTP 协议中用于实现会话状态管理的一种机制[^1][^2]。 #### Cookie 的基本特征: 1. **客户端存储**:保存在用户浏览器中(内存或硬盘) 2. **键值对格式**:以 `name=value` 形式存储数据 3. **域名绑定**:只能被创建它的域名访问 4. **有效期控制**:可设置过期时间(会话 Cookie持久 Cookie) 5. **大小限制**:通常每个 Cookie ≤ 4KB,每个域名下 ≤ 20 个 Cookie ### Cookie 在 Web 开发中的作用 1. **会话状态管理** - 保持用户登录状态(最常见的用途) - 示例:用户登录后服务器返回包含会话 ID 的 Cookie,后续请求自动携带该 ID 以识别用户[^2] 2. **个性化设置存储** - 保存用户偏好(语言、主题、布局等) - 示例:`theme=dark` 存储夜间模式选择[^3] 3. **购物车功能实现** - 电商网站中暂存用户选择的商品 - 示例:`cart_items=[123,456]` 存储商品 ID 列表 4. **用户行为跟踪** - 记录用户浏览历史(需符合隐私政策) - 示例:广告平台使用第三方 Cookie 跨站跟踪 5. **认证令牌传递** - 在前后端分离架构中传递 JWT 等认证令牌 - 示例:`Authorization=Bearer xxxx.yyyy.zzzz` ### Cookie 工作原理示意图 ```mermaid sequenceDiagram 浏览器->>服务器: 请求登录 服务器->>浏览器: HTTP响应 + Set-Cookie: session_id=abc123 浏览器->>服务器: 后续请求 + Cookie: session_id=abc123 服务器->>浏览器: 返回个性化内容 ``` ### Cookie 创建示例 服务器通过 HTTP 响应头创建 Cookie: ```http HTTP/1.1 200 OK Set-Cookie: user_id=u12345; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure; HttpOnly; SameSite=Lax ``` ### JavaScript 操作 Cookie ```javascript // 设置 Cookie document.cookie = "theme=dark; max-age=2592000; path=/"; // 读取 Cookie const getCookie = (name) => { return document.cookie .split('; ') .find(row => row.startsWith(name)) ?.split('=')[1]; }; console.log(getCookie('theme')); // 输出: dark ``` ### 安全最佳实践[^3][^5] 1. **敏感信息**:避免存储密码、信用卡号等敏感数据 2. **HttpOnly 属性**:防止 XSS 攻击读取 Cookie ```http Set-Cookie: session_id=xyz; HttpOnly ``` 3. **Secure 属性**:仅通过 HTTPS 传输 4. **SameSite 属性**:防范 CSRF 攻击 5. **合理有效期**:设置适当的过期时间 ### 相关问题 1. CookieSession 的主要区别是什么? 2. 如何防止 Cookie 被窃取或篡改? 3. 现代 Web 应用中 Cookie 的替代方案有哪些? 4. 如何实现跨域 Cookie 的安全共享? 5. GDPR 等隐私法规对 Cookie 使用有哪些限制? [^1]: Cookie:HTTP会话管理的基础 [^2]: CookieSession会话技术的核心 [^3]: Java Web 之 Cookie 详解 [^5]: 前端必备技能:全面解析 Cookie 在 Web 开发中的应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值