Cookie和Session

本文详细介绍了Cookie和Session的概念及使用。Cookie是服务器发送到浏览器并保存在客户端的小型信息,用于会话管理,每个Cookie大小不超过4KB。服务器可通过setMaxAge()控制其生命周期。Session接口代表客户端与服务器的会话,用于保存用户信息,通过setMaxInactiveInterval()设置超时时间。Session依赖于Cookie技术实现,其默认超时时间为30分钟。

Cookie

什么是Cookie:Cookie是服务器通知客户端保存键值对的一种技术

创建一个cookie,cookie是servlet发送到Web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie的值可以唯一的标识浏览器客户端,因此cookie常用于会话管理

每个cookie的大小不能超过4kb。客户端有了cookie之后,每次请求都发送给服务器

创建Cookie并通知客户端保存

  1. 创建Cookie对象
Cookie cookie=new Cookie("key","value");
  1. 通知客户端保存Cookie
resp.addCookie(cookie);

服务器获取Cookie

req.getCookies();  //返回Cookie对象的数组Cookie[]

Cookie值的修改:服务器可以修改Cookie的值
方案一:
1、先在服务器创建一个同名(key)的Cookie对象
2、在构造器,同时赋予新的Cookie值
3、调用addCookie()方法

方案二:
1、先查找到需要修改的Cookie对象
2、调用setValue()方法赋予新的值
3、调用addCookie()方法通知客户端保存修改

Cookie的生命控制
Cookie的生命控制是指如何管理Cookie什么时候被销毁(删除)

主要由一个方法来决定:

setMaxAge(); //参数设置cookie的最大生存时间,以秒为单位
  • 正值:表示在指定的秒数后过期
  • 负值:意味着cookie不会被持久存储,将在web浏览器退出时删除(默认值是-1)
  • 0:表示马上删除cookie

Cookie有效路径Path的设置
Cookie 的path属性可以有效的过滤哪些Cookie可以发送给服务器。哪些不发

path属性是通过请求的地址来进行有效的过滤
设置path属性: setPath()

Session会话

什么是Session会话?
Session是一个接口:HttpSession

Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术

每个客户端都有一个自己的Session会话。Session会话中,我们常用来保存用户登录之后的信息

Session的创建和获取
创建和获取是使用同一个API:

request.getSession()

第一次调用此方法是创建Session,之后调用此方法是获取之前创建好的Session会话对象

我们可以通过调用isNew()方法判断这个Session是否是刚刚创建的:

  • true:表示刚创建
  • false:表示获取之前创建

每个会话都有一个唯一的id号码
getId() 方法获取得到Session会话的id值

Session也是一个域对象,可以往域中存取数据

Session的生命周期控制

public void setMaxInactiveInterval(int interval) ;//设置Session会话的超时时长(以秒为单位)。超过指定的时长Session就会被销毁
  • 参数值为正数时,是设定Session的超时时长
  • 参数值为负数时,表示永不超时(极少使用)

其他方法:

  • public void invalidate() 让当前Session会话马上超时无效
  • public int getMaxInactiveInterval() 获取Session的超时时长

Session的默认超时时长为:30分钟。因为在Tomcat服务器的web.xml配置文件中默认有以下的配置

	<session-config>
    		<session-timeout>30</session-timeout>
  	</session-config>

以上配置表面配置了当前Tomcat服务器下所有的Session会话的超时时长都默认为30分钟
如果我们想配置自己的web工程中的Session会话超时时长默认为其他时长,可以在工程中的web.xml
中做以上相同的配置

注意
1、Session超时的概念:客户端两次请求之间的最大间隔时长
2、Session技术底层是基于Cookie技术来实现的

<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、付费专栏及课程。

余额充值