sessionId的生成机制

本文深入解析了Session的工作原理,包括SessionID的生成机制、Session的创建与销毁方式,以及Session在服务器端的存储位置。探讨了Session如何在客户端与服务器间进行交互,以及Session在Java中的实现细节。
目录

面试问道这个我居然不知道怎么回答,当然也是因为我确实没有研究过。下面就是百度了一篇文章后简单回答这个问题。

参考:http://www.cnblogs.com/sharpxiajun/p/3395607.html

http://lavasoft.blog.51cto.com/62575/275589/

 

sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。

session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;

存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。

那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

 

创建:sessionid第一次产生是在直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。

删除:超时;程序调用HttpSession.invalidate();程序关闭;

session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)。

session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象

session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。
 
 
下面是tomcat中session的创建:
ManagerBase是所有session管理工具类的基类,它是一个抽象类,所有具体实现session管理功能的类都要继承这个类,该类有一个受保护的方法,该方法就是创建sessionId值的方法:
(tomcat的session的id值生成的机制是一个随机数加时间加上jvm的id值,jvm的id值会根据服务器的硬件信息计算得来,因此不同jvm的id值都是唯一的),
StandardManager类是tomcat容器里默认的session管理实现类,
它会将session的信息存储到web容器所在服务器的内存里。
PersistentManagerBase也是继承ManagerBase类,它是所有持久化存储session信息的基类,PersistentManager继承了PersistentManagerBase,但是这个类只是多了一个静态变量和一个getName方法,目前看来意义不大,对于持久化存储session,tomcat还提供了StoreBase的抽象类,它是所有持久化存储session的基类,另外tomcat还给出了文件存储FileStore和数据存储JDBCStore两个实现。

转载于:https://www.cnblogs.com/UncleWang001/p/9606443.html

### ### Session ID 的生成机制 Session ID 是服务器在客户端首次请求会话时生成的一个唯一标识符,用于标识与该客户端关联的会话数据。生成 Session ID 的过程通常基于一种特殊算法,确保其唯一性和安全性。例如,在 Tomcat 中,Session ID 的生成机制结合了随机数、时间戳以及 JVM 的唯一标识符,从而保证生成的 ID 具备高度的唯一性和不可预测性[^4]。 Session ID 的生成不仅需要考虑唯一性,还需要具备足够的安全性,以防止被恶意攻击者伪造或篡改。为此,服务器通常采用加密算法或安全的随机数生成器来创建 Session ID。生成的 Session ID 会被存储在服务器端,并与对应的会话数据关联。客户端则通过 Cookie、URL 重写或请求头等方式携带 Session ID,以便服务器在后续请求中识别用户会话[^1]。 ### ### Session ID 的管理方式 Session ID 的管理主要由服务器端负责。服务器在创建 Session 时,会为每个会话分配一个唯一的 Session ID,并将其存储在服务器的内存、文件系统或数据库中。例如,Tomcat 提供了多种 Session 管理实现,包括默认的 `StandardManager`(将 Session 数据存储在内存中)和 `PersistentManager`(支持会话数据持久化),并通过 `FileStore` 或 `JDBCStore` 实现文件或数据库存储[^4]。 当客户端关闭浏览器时,Session ID 本身不会立即失效。服务器端的 Session 会根据配置的超时时间(如 30 分钟)自动销毁,而不是依赖客户端的关闭行为。为了提升会话管理的灵活性和可扩展性,现代 Web 应用通常采用分布式 Session 存储方案(如 Redis 或 Memcached),以支持跨服务器的会话共享[^3]。 ### ### Session ID 的使用方式 在实际使用中,Session ID 通常通过 Cookie 发送至客户端。服务器在创建 Session 后,会将 Session ID 作为 Cookie 的值发送给浏览器,并在后续请求中由浏览器自动携带该 Cookie。这种方式简化了 Session ID 的管理,同时减少了客户端的开发复杂度。此外,Session ID 也可以通过 URL 重写(如在 URL 中附加 `jsessionid`)或请求头传递,适用于不支持 Cookie 的客户端场景[^2]。 以下是一个典型的 Session ID 生成和使用的 Java 示例: ```java // 获取或创建 Session HttpSession session = request.getSession(); // 获取 Session ID String sessionId = session.getId(); // 在响应中发送 Session ID(通常由服务器自动处理) Cookie cookie = new Cookie("JSESSIONID", sessionId); cookie.setMaxAge(-1); // 会话 Cookie,浏览器关闭时失效 response.addCookie(cookie); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值