`
fj_ding
  • 浏览: 37332 次
社区版块
存档分类
最新评论

Tomcat中session详解(源码阅读)

阅读更多

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.rar

    【标题】:“Tomcat Redis Session”指的是在Tomcat集群环境中,通过Redis来实现Session的共享与同步,以解决集群中的Session一致性问题。 【描述】:“Tomcat集群Nginx使用Redis保证Session同步”这一场景中,通常...

    tomcat架构的源码分析

    #### 二、Tomcat各个组件详解 ##### 1. Server组件 - **定义**:`Server`组件是Tomcat实例的顶层元素,代表整个容器,由`org.apache.catalina.Server`接口定义。它控制着Tomcat实例的启动与停止过程。 - **功能**...

    tomcat 与 java web 开发技术详解 书源码

    JSP通过内置对象(如request、response、session等)与Servlet交互,源码中可能会展示如何在JSP中操作这些对象,以及自定义标签库(JSTL)的应用。 5. **JavaMail**:标签中提到的`javamails`可能涉及到JavaMail ...

    Tomcat如何监控并删除超时Session详解

    Session是Tomcat内部使用的接口,可以做一些内部调用 StandardSession是标准的HttpSession实现,同时它也实现了Session接口,用于Tomcat内部管理 StandardSessionFacade,类名已经指明它就是一个“门面

    Tomcat+java+web+开发技术详解-孙卫琴-第二版 源码

    总的来说,《Tomcat+Java+Web开发技术详解》是一本系统全面地介绍Java Web开发的教程,结合源码学习,读者能够从理论到实践,深入理解和掌握Java Web应用的开发流程和技术细节,为成为专业Java Web开发者打下坚实...

    tomcat集群配置

    了解Tomcat集群的工作原理,深入阅读Tomcat源码是十分有益的,可以帮助理解其内部机制。同时,使用诸如JMeter、VisualVM等工具进行性能测试和监控,可以更好地优化集群配置。 综上所述,Tomcat集群配置涉及到多个...

    Tomcat与JavaWeb开发技术详解(孙卫琴)

    《Tomcat与JavaWeb开发技术详解》一书深入剖析了JavaWeb开发中的核心组件——Tomcat服务器,旨在帮助开发者理解并掌握如何有效地使用Tomcat进行Web应用的部署和管理。Tomcat作为开源的轻量级应用服务器,是JavaEE...

    tomcat 集成 osgi服务,示例源码

    标题"tomcat 集成 osgi服务,示例源码"表明这个主题是关于如何在Apache Tomcat服务器中整合OSGi(Open Services Gateway Initiative)服务的实践教程。OSGi是一种模块化系统,它允许Java应用程序以组件的形式进行构建...

    Tomcat与Java.Web开发技术详解附书光盘1

    《Tomcat与Java.Web开发技术详解》是一本深入探讨Java Web应用服务器——Tomcat以及相关开发技术的专业书籍。光盘附带的"sourcecode1"文件可能是书中示例代码或练习项目的源码,旨在帮助读者更好地理解和实践所学...

    Tomcat集群——使用MSM管理集群Session

    本篇将深入探讨如何使用Multicast Session Manager (MSM)来实现在Tomcat集群中的Session共享。 【描述】:由于描述为空,我们直接进入主题。在Tomcat集群中,当用户请求被负载均衡到不同的服务器时,保持用户的...

    jsp应用开发详解源码

    《JSP应用开发详解源码解析》 在深入学习JSP(Java Server Pages)应用开发的过程中,源码分析是提升技能的重要环节。本资料“jsp应用开发详解源码1-4章”旨在帮助开发者通过实践代码理解JSP的核心概念和技术,从而...

    tomcat与java web开发技术详解关盘内容

    【压缩包子文件的文件名称列表】:“Tomcat与Java.Web开发技术详解源码”很可能包含了与教程配套的示例代码,这些代码涵盖了Java Web开发的关键环节,例如Servlet的编写、JSP页面设计、MVC模式的应用等。通过这些...

    apache+Tomcat负载平衡设置详解

    Apache和Tomcat的组合在企业级应用服务器领域中广泛应用,主要得益于它们的高效性和灵活性。Apache作为静态资源处理的强者,而Tomcat则擅长处理Java Servlet和JSP应用。通过负载平衡设置,我们可以将流量有效地分发...

    tomcat并发资料

    11. **源码阅读**:深入阅读Tomcat源码可以帮助理解其内部机制,找出性能瓶颈,进行针对性优化。 12. **工具辅助**:利用工具如VisualVM、JProfiler等进行性能剖析,找出CPU、内存、线程等方面的问题。 综上,掌握...

    Tomcat常见问题集锦(持续更新)

    11. **Tomcat源码阅读**: - 对于深入理解Tomcat的工作原理,阅读源码是很有帮助的。 - 可以利用IDE的调试功能,跟踪代码执行流程。 12. **工具辅助**: - 使用JVisualVM、MAT(Memory Analyzer Tool)等工具...

    apache-tomcat-9.0.24.rar

    - **JSP转换过程**:JSP文件在首次请求时会被Tomcat转换为Servlet源码,编译成字节码并加载到内存中执行。 - **Session管理**:了解如何设置和管理Session,以及如何处理Session过期和失效。 - **安全考虑**:验证码...

    基于java的开发源码-应用服务器 Tomcat.zip

    通过`cluster`模块,多个Tomcat实例可以共享Session数据,实现故障转移和负载分发。结合其他负载均衡工具,如Nginx或Apache HTTP Server,可以构建更强大的分布式环境。 7. **热部署与版本管理** Tomcat支持热部署...

    MyEclipse整合SSH开发登录功能详解及源码

    源码中应包含以下几个关键部分: 1. 用户实体类(User.java):包含用户名和密码属性,以及对应的getter和setter方法。 2. UserDAO.java:包含验证用户信息的方法,如`public User login(String username, String ...

    tomcat 工作原理

    **Tomcat工作原理详解** Tomcat是一款开源的Java Servlet容器,它是Apache软件基金会 Jakarta项目的一部分。作为Web服务器,Tomcat负责处理HTTP请求并提供HTTP响应,同时它也扮演着Servlet容器的角色,允许开发者...

Global site tag (gtag.js) - Google Analytics