会话技术-jsessionid的持久化(十九)

本文介绍了一种通过设置Cookie的生存时间来确保Session信息在浏览器重启后仍可获取的方法。通过Servlet示例展示了如何创建并保存Session,同时设置JSESSIONID的Cookie以实现跨会话的数据持久化。

当我们把浏览器关闭了之后,session依然存在。但是,再次打开浏览器去访问这个session,就拿不到了。是因为,我们的cookie(jsessionid)没有了。

cookie默认是会话级别,我们把cookie的生存时间设置久一些就好了。

package com.ken.session;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 创建属于该客户端(会话)的私有的session区域
		/*
		 * request.getSession()方法内部会判断 该客户端是否在服务器已经存在session
		 * 如果该客户端在此服务器不存在session,那么就会创建一个新的session对象
		 * 如果该客户端在此服务器已经存在session,就会获得该session返回
		 */
		HttpSession session = request.getSession();

		session.setAttribute("name", "jerry");

		String id = session.getId();// 该session对象的编号id(JSESSIONID)

		// 手动创建一个存储JSESSIONID的Cookie,为该cookie设置持久化时间
		Cookie cookie = new Cookie("JSESSIONID", "id");
//		cookie.setPath("/cookieDemo/");
		cookie.setMaxAge(10 * 60);

		response.addCookie(cookie);

		response.getWriter().write("JSESSIONID:" + id);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

<think>我们正在讨论JSESSIONID的Expires/Max-Age属性显示为"会话"(Session)的含义。根据之前的引用和背景知识,我们可以这样解释: 在引用[1]中提到,当cookie的`setMaxAge`方法传入一个负数时,该cookie是一个会话cookie,关闭浏览器时会被删除。同样,在引用[2]中,虽然没有直接提到会话,但提到了expires是失效日期,而如果设置为会话,则意味着没有设置一个具体的失效日期。 因此,对于JSESSIONID这个cookie(通常用于维护用户的会话状态),当它的Expires/Max-Age属性在浏览器中显示为"会话"时,意味着这个cookie是一个会话级别的cookie(Session Cookie),它的生命周期仅限于当前的浏览器会话。也就是说: 1. **浏览器关闭时自动删除**:当用户关闭浏览器时,这个cookie会被自动清除。 2. **没有设置具体的过期时间**:它不会持久化保存到用户的硬盘上,而是保存在内存中。 3. **会话管理**:这种设计是为了安全,因为会话结束时(比如关闭浏览器),用户的会话状态就应该结束,服务器端的session也可能在超时后被销毁(虽然服务器端session的销毁时间与这个cookie的过期时间没有直接关系,但通常服务器会设置一个session超时时间,比如30分钟不活动则销毁)。 另外,根据引用[4],我们知道JSESSIONID通常用于关联服务器端的session,所以这个cookie的有效期与会话一致是合理的。 因此,在浏览器的开发者工具中,当你看到JSESSIONID的Expires/Max-Age显示为"会话"时,它表示这个cookie是临时的,浏览器关闭就会消失。 ### 总结 - **含义**:JSESSIONID的有效期仅持续在当前浏览器会话期间,关闭浏览器即失效。 - **设置方式**:在服务器端创建JSESSIONID这个cookie时,没有设置`Max-Age`(或者设置了负数)或`Expires`属性,因此浏览器将其视为会话cookie。 - **目的**:保障用户会话的安全性,避免长期有效的cookie带来的安全风险。 ### 相关问题§§ 1. 如何将JSESSIONID设置为长期有效的cookie(比如7天有效)?这样做有什么风险? 2. 服务器端session的超时时间与JSESSIONID的过期时间有什么关联? 3. 如果浏览器关闭后重新打开,为什么有些网站还能保持登录状态(即使JSESSIONID会话cookie)? </think>### JSESSIONID 的 Expires/Max-Age 显示"会话"的含义 当浏览器开发者工具中 JSESSIONID 的 **Expires/Max-Age** 属性显示为"会话"(Session) 时,这表示该 Cookie 属于**会话级 Cookie**,具有以下核心特性: 1. **生命周期绑定浏览器进程** - 仅在当前浏览器标签页或窗口打开期间有效 - 关闭浏览器窗口后自动删除 - 重新打开浏览器时会生成全新的 JSESSIONID 2. **服务器端的设置方式** 在 Java Servlet 中,当不显式设置 `setMaxAge()` 时默认创建会话 Cookie: ```java // 默认创建会话JSESSIONID HttpSession session = request.getSession(); ``` 等价于: ```java Cookie jsessionid = new Cookie("JSESSIONID", sessionId); jsessionid.setMaxAge(-1); // 关键设置:负值表示会话Cookie[^1] ``` 3. **安全机制设计** - 避免长期保存会话凭证,降低会话劫持风险[^4] - 配合服务器 Session 超时机制(默认 30 分钟不活动自动失效) - 通常标记为 `Secure; HttpOnly` 防止客户端脚本访问 4. **与会话管理的关联** 浏览器每次请求携带 JSESSIONID → 服务器通过该 ID 查找对应的 Session 对象 → 存取用户状态数据[^3]。整个过程不需要持久化存储会话 ID。 ```mermaid graph LR A[浏览器请求] --> B{服务器检查<br>Cookie中的JSESSIONID} B -- 存在 --> C[查找对应Session对象] B -- 不存在 --> D[创建新Session<br>生成新JSESSIONID] C --> E[使用Session中的用户数据] D --> F[通过Set-Cookie返回新JSESSIONID] ``` ### 对比会话Cookie与持久Cookie | 特性 | 会话Cookie (Session) | 持久Cookie | |--------------------|----------------------------|-------------------------| | Expires/Max-Age | 显示"会话" | 具体日期/秒数 | | 存储位置 | 浏览器内存 | 硬盘文件 | | 关闭浏览器后 | 自动删除 | 保留至过期 | | 典型应用场景 | 会话管理、登录状态 | 长期偏好设置、自动登录 | | JSESSIONID 使用 | 默认方式 | 需显式设置 setMaxAge() | ### 注意事项 1. 即使 JSESSIONID会话 Cookie,服务器 Session 可能在超时后提前失效(默认 30 分钟) 2. 浏览器恢复会话功能(如 Chrome 的"继续浏览")可能保留会话 Cookie,但这属于浏览器行为扩展 3. 需配合 `SameSite` 属性防止 CSRF 攻击,推荐设置为 `SameSite=Lax`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值