| 与会话相关的 Cookie 是 Tomcat 内部自己生成的,当在 Servlet 中使用 Request.getSession()  获取会话对象时,就会触发执行,核心代码: protected Session doGetSession(boolean create) {   ...   // 创建 Session 实例   if (connector.getEmptySessionPath() && isRequestedSessionIdFromCookie()) {     // 如果会话 ID 来自 cookie,请重用该 ID,如果来自 URL,请不要     // 重用该会话ID,以防止可能的网络钓鱼攻击     session = manager.createSession(getRequestedSessionId());   } else {     session = manager.createSession(null);   }   // 基于该 Session 创建一个新的会话 cookie   if ((session != null) && (getContext() != null)        && getContext().getCookies()) {     String scName = context.getSessionCookieName();     if (scName == null) {       // 默认 JSESSIONID       scName = Globals.SESSION_COOKIE_NAME;     }     // 新建 Cookie     Cookie cookie = new Cookie(scName, session.getIdInternal());     // 设置 path domain secure     configureSessionCookie(cookie);     // 添加到响应头域     response.addSessionCookieInternal(cookie, context.getUseHttpOnly());   }   if (session != null) {     session.access();     return (session);   } else {     return (null);   } } 
 添加到响应头域,就是根据 Cookie 对象,生成如开始描述的格式那样。 3. Session Session 是 Tomcat 内部的一个接口,是 HttpSession 的外观类,用于维护 web  应用特定用户的请求之间的状态信息。相关类图设计如下: 
 关键类或接口的作用如下: 
    Manager - 管理 Session 池,不同的实现提供特定的功能,如持久化和分布式ManagerBase - 实现了一些基本功能,如 Session 池,唯一ID生成算法,便于继承扩展StandardManager -  标准实现,可在此组件重新启动时提供简单的会话持久性(例如,当整个服务器关闭并重新启动时,或重新加载特定Web应用程序时)PersistentManagerBase - 提供多种不同的持久化存储管理方式,如文件和数据库Store - 提供持久化存储和加载会话和用户信息ClusterManager - 集群 session 管理接口,负责会话的复制方式DeltaManager - 将会话数据增量复制到集群中的所有成员BackupManager - 将数据只复制到一个备份节点,集群中所有成员可看到这个节点 本文不分析集群复制的原理,只分析单机 Session 的管理。 3.1 创建 Session 在 Servlet 中首次使用 Request.getSession() 获取会话对象时,会创建一个 StandardSession 实例: public Session createSession(String sessionId) {   // 默认返回的是 new StandardSession(this) 实例   Session session = createEmptySession();   // 初始化属性   session.setNew(true);   session.setValid(true);   session.setCreationTime(System.currentTimeMillis());   // 设置会话有效时间,单位 秒,默认 30 分钟,为负值表示永不过期   session.setMaxInactiveInterval(((Context) getContainer()).getSessionTimeout() * 60);   if (sessionId == null) {     // 生成一个会话 ID     sessionId = generateSessionId();      session.setId(sessionId);   sessionCounter++;    SessionTiming timing = new SessionTiming(session.getCreationTime(), 0);   synchronized (sessionCreationTiming) {     sessionCreationTiming.add(timing);     sessionCreationTiming.poll();   }   return (session); } 
 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |