Tomcat中的session是通过一个manager来管理的,其中Session接口默认实现类有StandardSession,管理器的默认实现是StandardManager。
我们平时在servlet中使用的session也就是HashMap中的一个session对象,同时session除了在内存存储,同时还提供了持久化方法,tomcat中持久化有两种,一种是保存为文件,另一种则是保存到数据库。
这一节首先来看一下默认的StandardSession和StandardManager。
public interface Session { // ----------------------------------------------------- Manifest Constants public static final String SESSION_CREATED_EVENT = "createSession"; public static final String SESSION_DESTROYED_EVENT = "destroySession"; // ------------------------------------------------------------- Properties public String getAuthType(); public void setAuthType(String authType); public long getCreationTime(); public void setCreationTime(long time); public String getId(); public void setId(String id); public String getInfo(); public long getLastAccessedTime(); public Manager getManager(); public void setManager(Manager manager); public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int interval); public void setNew(boolean isNew); public Principal getPrincipal(); public void setPrincipal(Principal principal); public HttpSession getSession(); public void setValid(boolean isValid); public boolean isValid(); // --------------------------------------------------------- Public Methods public void access(); public void addSessionListener(SessionListener listener); public void expire(); public Object getNote(String name); public Iterator getNoteNames(); public void recycle(); public void removeNote(String name); public void removeSessionListener(SessionListener listener); public void setNote(String name, Object value); }
1.StandardManager中整个启动过程
public void start() throws LifecycleException { if (debug >= 1) log("Starting"); // Validate and update our current component state if (started) throw new LifecycleException (sm.getString("standardManager.alreadyStarted")); lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; // Force initialization of the random number generator if (debug >= 1) log("Force random number initialization starting"); String dummy = generateSessionId(); if (debug >= 1) log("Force random number initialization completed"); // Load unloaded sessions, if any try { //用于加载持久化的session,加载以后放入sessions(hashMap)中 load(); } catch (Throwable t) { log(sm.getString("standardManager.managerLoad"), t); } // Start the background reaper thread threadStart(); } //启动一个管理器线程,用于实现自动重新加载 private void threadStart() { if (thread != null) return; threadDone = false; threadName = "StandardManager[" + container.getName() + "]"; thread = new Thread(this, threadName); thread.setDaemon(true); thread.setContextClassLoader(container.getLoader().getClassLoader()); thread.start(); } /** * The background thread that checks for session timeouts and shutdown. */ public void run() { // Loop until the termination semaphore is set while (!threadDone) { threadSleep(); processExpires(); } } private void threadSleep() { try { Thread.sleep(checkInterval * 1000L); } catch (InterruptedException e) { ; } } /** * Invalidate all sessions that have expired. */ //管理StandardSession中session,去除无效的session private void processExpires() { long timeNow = System.currentTimeMillis(); //获取存活的sessions Session sessions[] = findSessions(); for (int i = 0; i < sessions.length; i++) { StandardSession session = (StandardSession) sessions[i]; //有效,则不移除 if (!session.isValid()) continue; int maxInactiveInterval = session.getMaxInactiveInterval(); //如果设置最大存活时间是-1,则不终止 if (maxInactiveInterval < 0) continue; int timeIdle = // Truncate, do not round up (int) ((timeNow - session.getLastAccessedTime()) / 1000L); if (timeIdle >= maxInactiveInterval) { try { session.expire(); } catch (Throwable t) { log(sm.getString("standardManager.expireException"), t); } } } }
2.StandardManager中整个停止过程
public void stop() throws LifecycleException { if (debug >= 1) log("Stopping"); // Validate and update our current component state if (!started) throw new LifecycleException (sm.getString("standardManager.notStarted")); lifecycle.fireLifecycleEvent(STOP_EVENT, null); started = false; // Stop the background reaper thread threadStop(); // Write out sessions try { //将存活的session持久化 unload(); } catch (IOException e) { log(sm.getString("standardManager.managerUnload"), e); } // Expire all active sessions Session sessions[] = findSessions(); for (int i = 0; i < sessions.length; i++) { StandardSession session = (StandardSession) sessions[i]; if (!session.isValid()) continue; try { //终止所有的session session.expire(); } catch (Throwable t) { ; } } // Require a new random number generator if we are restarted this.random = null; private void threadStop() { if (thread == null) return; threadDone = true; //将当前线程设置为中断状态 thread.interrupt(); try { //当前线程被挂起,直达thread线程结束才运行改线程 thread.join(); } catch (InterruptedException e) { ; } thread = null; }
3.StandardManager中创建一个session
public Session createSession() { if ((maxActiveSessions >= 0) && (sessions.size() >= maxActiveSessions)) throw new IllegalStateException (sm.getString("standardManager.createSession.ise")); //实际调用的是ManagerBase中的creatSession()方法 return (super.createSession()); } //ManagerBase类中creatSession方法 public Session createSession() { // Recycle or create a Session instance Session session = null; synchronized (recycled) { int size = recycled.size(); if (size > 0) { session = (Session) recycled.get(size - 1); recycled.remove(size - 1); } } if (session != null) session.setManager(this); else session = new StandardSession(this); // Initialize the properties of the new session and return it session.setNew(true); session.setValid(true); session.setCreationTime(System.currentTimeMillis()); session.setMaxInactiveInterval(this.maxInactiveInterval); String sessionId = generateSessionId(); String jvmRoute = getJvmRoute(); // @todo Move appending of jvmRoute generateSessionId()??? if (jvmRoute != null) { sessionId += '.' + jvmRoute; session.setId(sessionId); } /* synchronized (sessions) { while (sessions.get(sessionId) != null) // Guarantee uniqueness sessionId = generateSessionId(); } */ session.setId(sessionId); return (session); }
相关推荐
【标题】:“Tomcat Redis Session”指的是在Tomcat集群环境中,通过Redis来实现Session的共享与同步,以解决集群中的Session一致性问题。 【描述】:“Tomcat集群Nginx使用Redis保证Session同步”这一场景中,通常...
#### 二、Tomcat各个组件详解 ##### 1. Server组件 - **定义**:`Server`组件是Tomcat实例的顶层元素,代表整个容器,由`org.apache.catalina.Server`接口定义。它控制着Tomcat实例的启动与停止过程。 - **功能**...
JSP通过内置对象(如request、response、session等)与Servlet交互,源码中可能会展示如何在JSP中操作这些对象,以及自定义标签库(JSTL)的应用。 5. **JavaMail**:标签中提到的`javamails`可能涉及到JavaMail ...
Session是Tomcat内部使用的接口,可以做一些内部调用 StandardSession是标准的HttpSession实现,同时它也实现了Session接口,用于Tomcat内部管理 StandardSessionFacade,类名已经指明它就是一个“门面
总的来说,《Tomcat+Java+Web开发技术详解》是一本系统全面地介绍Java Web开发的教程,结合源码学习,读者能够从理论到实践,深入理解和掌握Java Web应用的开发流程和技术细节,为成为专业Java Web开发者打下坚实...
了解Tomcat集群的工作原理,深入阅读Tomcat源码是十分有益的,可以帮助理解其内部机制。同时,使用诸如JMeter、VisualVM等工具进行性能测试和监控,可以更好地优化集群配置。 综上所述,Tomcat集群配置涉及到多个...
《Tomcat与JavaWeb开发技术详解》一书深入剖析了JavaWeb开发中的核心组件——Tomcat服务器,旨在帮助开发者理解并掌握如何有效地使用Tomcat进行Web应用的部署和管理。Tomcat作为开源的轻量级应用服务器,是JavaEE...
标题"tomcat 集成 osgi服务,示例源码"表明这个主题是关于如何在Apache Tomcat服务器中整合OSGi(Open Services Gateway Initiative)服务的实践教程。OSGi是一种模块化系统,它允许Java应用程序以组件的形式进行构建...
《Tomcat与Java.Web开发技术详解》是一本深入探讨Java Web应用服务器——Tomcat以及相关开发技术的专业书籍。光盘附带的"sourcecode1"文件可能是书中示例代码或练习项目的源码,旨在帮助读者更好地理解和实践所学...
本篇将深入探讨如何使用Multicast Session Manager (MSM)来实现在Tomcat集群中的Session共享。 【描述】:由于描述为空,我们直接进入主题。在Tomcat集群中,当用户请求被负载均衡到不同的服务器时,保持用户的...
《JSP应用开发详解源码解析》 在深入学习JSP(Java Server Pages)应用开发的过程中,源码分析是提升技能的重要环节。本资料“jsp应用开发详解源码1-4章”旨在帮助开发者通过实践代码理解JSP的核心概念和技术,从而...
【压缩包子文件的文件名称列表】:“Tomcat与Java.Web开发技术详解源码”很可能包含了与教程配套的示例代码,这些代码涵盖了Java Web开发的关键环节,例如Servlet的编写、JSP页面设计、MVC模式的应用等。通过这些...
Apache和Tomcat的组合在企业级应用服务器领域中广泛应用,主要得益于它们的高效性和灵活性。Apache作为静态资源处理的强者,而Tomcat则擅长处理Java Servlet和JSP应用。通过负载平衡设置,我们可以将流量有效地分发...
11. **源码阅读**:深入阅读Tomcat源码可以帮助理解其内部机制,找出性能瓶颈,进行针对性优化。 12. **工具辅助**:利用工具如VisualVM、JProfiler等进行性能剖析,找出CPU、内存、线程等方面的问题。 综上,掌握...
11. **Tomcat源码阅读**: - 对于深入理解Tomcat的工作原理,阅读源码是很有帮助的。 - 可以利用IDE的调试功能,跟踪代码执行流程。 12. **工具辅助**: - 使用JVisualVM、MAT(Memory Analyzer Tool)等工具...
- **JSP转换过程**:JSP文件在首次请求时会被Tomcat转换为Servlet源码,编译成字节码并加载到内存中执行。 - **Session管理**:了解如何设置和管理Session,以及如何处理Session过期和失效。 - **安全考虑**:验证码...
通过`cluster`模块,多个Tomcat实例可以共享Session数据,实现故障转移和负载分发。结合其他负载均衡工具,如Nginx或Apache HTTP Server,可以构建更强大的分布式环境。 7. **热部署与版本管理** Tomcat支持热部署...
源码中应包含以下几个关键部分: 1. 用户实体类(User.java):包含用户名和密码属性,以及对应的getter和setter方法。 2. UserDAO.java:包含验证用户信息的方法,如`public User login(String username, String ...
**Tomcat工作原理详解** Tomcat是一款开源的Java Servlet容器,它是Apache软件基金会 Jakarta项目的一部分。作为Web服务器,Tomcat负责处理HTTP请求并提供HTTP响应,同时它也扮演着Servlet容器的角色,允许开发者...