Web中sessionid如何产生?由谁产生?保存在哪里?

原文地址:https://blog.csdn.net/weixin_37864013/article/details/80230290

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

创建:客户端调用 HttpServletRequest.getSession()创建

销毁:只能通过HttpSession.invalidate()销毁(默认为true)超时

    注:关闭浏览器不会关闭session;

            tomcat的超时时间为20分钟;

存储位置:sesssion内容存储在服务器内存中,sessionId保存在客户端cookie

    注:可以持久化到file,数据库,memcache,redis等;

jsessionid生成原理:ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid

    注:jvm的id值会根据服务器的硬件信息计算得来,因此不同jvm的id值都是唯一的


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

猜你喜欢

转载自blog.csdn.net/tanga842428/article/details/80242018