与会话相干的 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);
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|