Cookie和Session

本文介绍了Cookie和Session这两种网络会话状态跟踪技术。Cookie由服务器生成并保存在客户端,用于跨请求的数据传递。Session则将数据保存在服务器端,通过JSSESSIONID进行跟踪。文章详细解释了这两种技术的工作原理及实现方式。

Cookie简介

Cookie是1993年由网景公司(Netscape)前雇员发明的一种进行网络会话状态跟踪的技术。

会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而Cookie就是一种这样的技术。

cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或者 Cookie没有失效,那么,保存在其中的会话状态就有效。

用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的Cookie 数据,发送到服务端,由服务器对会话进行跟踪。

Cookie技术并不是JavaWeb开发专属技术,而是属于web开发的技术,是所有web开发语言均支持的技术。Cookie是由若干键值对构成,这里的键一般称为name,值称为value。Cookie 中的键值对均为字符串。

@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 生成Cookie
        Cookie cookie1 = new Cookie("username", "pangjian");
        Cookie cookie2 = new Cookie("password", "123");
		// 添加到响应体
        response.addCookie(cookie1);
        response.addCookie(cookie2);

        response.sendRedirect("/studentweb/Servlet2");

    }

}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 获取,服务端是不用存储Cookie的
        Cookie[] cookies = request.getCookies();
        for (Cookie c : cookies) {
            System.out.println(c.getName() + c.getValue());
        }
        response.getWriter().print("获取cookie");
    }

}

Session简介

Session,即会话,是 web开发中的一种会话状态跟踪技术。前面的Cookie也是一种会话跟踪技术。不同的是cookie是将会话状态保存在了客户端,而Session则是将会话状态保存在了服务器端

“会话”是当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。

Session并不是Javaweb开发所特有的,而是整个web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。

@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// Session创建
        HttpSession httpSession = request.getSession(true);
        httpSession.setAttribute("username", "pangjian");

        response.sendRedirect("/studentweb/Servlet2");

    }

}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// Session获取
        // 获取时候设置为false,当获取不到Session时不新建一个Session
        HttpSession httpSession = request.getSession(false);
        String username = null;
        if (httpSession != null) {
            username = (String) httpSession.getAttribute("username");
        }
        response.getWriter().print(username);
    }

}

原理

在服务器中系统会为每个会话维护一个 Session。不同的会话,对应不同的session。

写入Session列表

服务器对当前应用中的Session是以Map 的形式进行管理的,这个Map称为 session列表。该Map的 key为一个32位长度的随机串,这个随机串称为JSSESSIONID , value则为 session对象的引用。当用户第一次提交请求时,服务端servlet中执行到request.getsession()方法后,会自动生成一个 Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。

服务器生成并发送Cookie

在将session信息写入Session列表后,系统还会自动将“JSSESSIONID”作为name,这个32位长度的随机串作为value,以cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端。

客户端接收并发送Cookie

客户端接收到这个Cookie 后会将其存放到浏览器的缓存中。即只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。当用户提交第二次请求时(为了保证第二次请求是该会话中,Cookie存了JSSESSIONID和资源路径),会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端。

从Session列表中查找

服务端从请求中读取到客户端发送来的cookie,并根据cookie的JSSESSIONID的值,从Map中查找相应 key所对应的value,即session对象。然后,对该Session对象的域属性进行读写操作。

<think>嗯,用户想了解CookieSession的概念、区别使用场景。从提供的引用内容来看,需要整理出一个清晰的结构化回答。 首先考虑基础概念部分。根据引用12,Cookie是存储在客户端的小型文本数据,由服务器通过Set-Cookie响应头设置,浏览器后续请求会自动携带。Session则是服务器端存储的用户会话信息,通常通过Session ID关联客户端,这个ID经常存储在Cookie里传递。 关于区别部分,引用1给出了详细对比维度:存储位置(客户端vs服务器)、安全性(Cookie有泄露风险)、存储容量(Cookie约4KB限制)、生命周期(Cookie可设置过期时间,Session依赖会话或超时设置)、性能(Session消耗服务器资源)等。引用3提到经典面试题常考这个区别,特别是HTTP无状态协议下它们的作用(引用4)。 使用场景方面,引用1指出Cookie适合持久化存储低敏感信息如用户偏好,Session适合存储敏感或临时数据如购物车。引用3还用医院挂号案例说明Session ID相当于就诊号,用户信息存在医院系统里。 需要特别注意安全问题。引用13都提到Cookie可能被窃取(XSS攻击)、Session可能被劫持,防护措施包括HttpOnly、Secure标记、定期更换Session ID等。引用4的面试题答案也强调HTTPS传输Session ID的重要性。 考虑在回答中加入具体示例增强理解。引用1给出JS设置CookieFlask使用Session的代码片段,准备在回答中展示基本用法。用户登录流程的交互图(引用3描述的Session创建过程)也需要用文字描述清楚。 最后需要总结两者互补关系:Session依赖Cookie传递ID是常见做法,但Token等其他方式也可行(引用3提到URL重写)。会强调现代Web开发中常结合使用,比如JWT方案其实融合了两者特性。 </think> 以下是CookieSession的核心知识整理,结合技术原理与实际应用场景: --- ### **一、基础概念** 1. **Cookie** - **定义**:服务器发送到用户浏览器并**存储在客户端**的小型文本数据(通常≤4KB)[^1][^2]。 - **工作流程**: ```mermaid graph LR A[服务器响应 Set-Cookie] --> B[浏览器存储Cookie] B --> C[后续请求自动携带Cookie] ``` - **示例代码**(JavaScript设置Cookie): ```javascript document.cookie = "username=John; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/"; ``` 2. **Session** - **定义**:服务器创建的**临时存储空间**(如用户ID、购物车数据),通过唯一Session ID关联客户端[^3]。 - **工作流程**: ```mermaid graph LR A[浏览器首次访问] --> B[服务器生成Session ID] B --> C[通过Cookie/URL传递Session ID] C --> D[服务器根据ID读取会话数据] ``` --- ### **二、核心区别** | **维度** | **Cookie** | **Session** | |----------------|-------------------------------------|----------------------------------| | 存储位置 | 客户端浏览器 | 服务器内存/数据库 | | 安全性 | 较低(可能被XSS窃取) | 较高(敏感信息不暴露给客户端) | | 存储容量 | ≤4KB(不同浏览器有差异) | 仅受服务器资源限制 | | 生命周期 | 可设长期有效(如`expires`属性) | 会话结束或超时(通常20-30分钟) | | 性能影响 | 无服务器负担 | 占用服务器资源 | | 数据传输 | 每次HTTP请求自动携带 | 仅传递Session ID | --- ### **三、使用场景** 1. **Cookie适用场景** - 记住登录状态(如`remember me`功能) - 保存用户个性化设置(语言/主题) - 跟踪用户行为(匿名数据分析)[^4] 2. **Session适用场景** - 存储敏感数据(银行卡号、地址) - 购物车信息临时存储 - 多步骤表单流程(如注册流程)[^1][^3] --- ### **四、安全实践** | **风险** | **防护措施** | |------------------|---------------------------------------| | Cookie劫持 | 添加`HttpOnly``Secure`属性 | | Session固定攻击 | 登录后重置Session ID | | CSRF攻击 | 同步使用CSRF Token | | 数据泄露 | Session数据加密存储(如AES-256) | > ✅ **最佳实践**:敏感操作(如支付)采用`Session + HTTPS`,非敏感数据用Cookie[^3]。 --- ### **五、经典面试题解析** 1. **Q: 如何解决分布式系统的Session共享?** - **A**:使用集中存储方案(Redis集群),避免服务器本地存储导致的会话丢失。 2. **Q: 禁用Cookie后如何使用Session?** - **A**:通过URL重写传递Session ID(如`/path;jsessionid=xxx`),但需注意URL暴露风险[^1]。 3. **Q: 为什么Session需要Cookie配合?** - **A**:HTTP协议无状态,Session ID需通过Cookie(或URL)在请求间传递以维持会话[^4]。 --- ### **六、总结** - **协作关系**:Session依赖Cookie传递ID是常见模式,但非唯一方案(如Token认证)。 - **趋势**:现代Web应用趋向**JWT(JSON Web Token)** 替代传统Session,实现无状态认证。 - **设计原则**: > 安全性要求高 → 用Session; > 跨会话持久化 → 用Cookie。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值