加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Tomcat 中的 Session 和 Cookie的爱恨情仇

发布时间:2019-05-16 00:09:19 所属栏目:业界 来源:顿悟源码
导读:HTTP 是一种无状态通讯协议,每个哀求之间彼此独立,处事器不能辨认曾经来过的哀求。而对付 Web 应用,它的勾当都是依靠某个状态的,好比用户登录,此时行使 HTTP 就必要它在一次登录哀求后,有为后续哀求提供已登录信息的手段。 办理步伐就是行使 Cookie

与会话相干的 Cookie 是 Tomcat 内部本身天生的,当在 Servlet 中行使 Request.getSession() 获取会话工具时,就会触发执行,焦点代码:

  1. protected Session doGetSession(boolean create) { 
  2.   ... 
  3.   // 建设 Session 实例 
  4.   if (connector.getEmptySessionPath() && isRequestedSessionIdFromCookie()) { 
  5.     // 假如会话 ID 来自 cookie,请重用该 ID,假如来自 URL,请不要 
  6.     // 重用该会话ID,以防备也许的收集垂纶进攻 
  7.     session = manager.createSession(getRequestedSessionId()); 
  8.   } else { 
  9.     session = manager.createSession(null); 
  10.   } 
  11.   // 基于该 Session 建设一个新的会话 cookie 
  12.   if ((session != null) && (getContext() != null) 
  13.        && getContext().getCookies()) { 
  14.     String scName = context.getSessionCookieName(); 
  15.     if (scName == null) { 
  16.       // 默认 JSESSIONID 
  17.       scName = Globals.SESSION_COOKIE_NAME; 
  18.     } 
  19.     // 新建 Cookie 
  20.     Cookie cookie = new Cookie(scName, session.getIdInternal()); 
  21.     // 配置 path domain secure 
  22.     configureSessionCookie(cookie); 
  23.     // 添加到相应头域 
  24.     response.addSessionCookieInternal(cookie, context.getUseHttpOnly()); 
  25.   } 
  26.   if (session != null) { 
  27.     session.access(); 
  28.     return (session); 
  29.   } else { 
  30.     return (null); 
  31.   } 

添加到相应头域,就是按照 Cookie 工具,天生如开始描写的名目那样。

3. Session

Session 是 Tomcat 内部的一个接口,是 HttpSession 的外面类,用于维护 web 应用特定用户的哀求之间的状态信息。相干类图计划如下:

Tomcat 中的 Session 和 Cookie的爱恨情仇

要害类或接口的浸染如下:

  • Manager - 打点 Session 池,差异的实现提供特定的成果,如耐久化和漫衍式
  • ManagerBase - 实现了一些根基成果,如 Session 池,独一ID天生算法,便于担任扩展
  • StandardManager - 尺度实现,可在此组件从头启动时提供简朴的会话耐久性(譬喻,当整个处事器封锁并从头启动时,或从头加载特定Web应用措施时)
  • PersistentManagerBase - 提供多种差异的耐久化存储打点方法,如文件和数据库
  • Store - 提供耐久化存储和加载会话和用户信息
  • ClusterManager - 集群 session 打点接口,认真会话的复制方法
  • DeltaManager - 将会话数据增量复制到集群中的全部成员
  • BackupManager - 将数据只复制到一个备份节点,集群中全部成员可看到这个节点

本文不说明集群复制的道理,只说明单机 Session 的打点。

3.1 建设 Session

在 Servlet 中初次行使 Request.getSession() 获取会话工具时,会建设一个 StandardSession 实例:

  1. public Session createSession(String sessionId) { 
  2.   // 默认返回的是 new StandardSession(this) 实例 
  3.   Session session = createEmptySession(); 
  4.   // 初始化属性 
  5.   session.setNew(true); 
  6.   session.setValid(true); 
  7.   session.setCreationTime(System.currentTimeMillis()); 
  8.   // 配置会话有用时刻,单元 秒,默认 30 分钟,为负值暗示永不外期 
  9.   session.setMaxInactiveInterval(((Context) getContainer()).getSessionTimeout() * 60); 
  10.   if (sessionId == null) { 
  11.     // 天生一个会话 ID 
  12.     sessionId = generateSessionId(); 
  13.    
  14.   session.setId(sessionId); 
  15.   sessionCounter++; 
  16.  
  17.   SessionTiming timing = new SessionTiming(session.getCreationTime(), 0); 
  18.   synchronized (sessionCreationTiming) { 
  19.     sessionCreationTiming.add(timing); 
  20.     sessionCreationTiming.poll(); 
  21.   } 
  22.   return (session); 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读