`
cectsky
  • 浏览: 45870 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

HttpSession 失效的内部机制

 
阅读更多

周六在公司加班,研究了下tomcat session失效的原理,直接上code,以后再补齐一些基本concept.

 

starttime = 2012-11-24 2:57pm (好久没update blog 看看写一篇用多久)

 

2种方式注销session

 

(1)主动 invoke Servlet API 

 

/**
     * Invalidates this session then unbinds any objects bound to it.
     * 
     * @exception IllegalStateException
     *                if this method is called on an already invalidated session
     */
public void invalidate();

 

 

说明:这是HttpSession规范中定义的interface, 看note说将一个session注销然后解除其他对象的绑定. 也就是删除掉session object. 它要求throw 一个Exception

 

tomcat中实现是先 check session object 是不是valid的,如果invalid 直接throw IllegalStateException

然后开始处理,如下

 

    /**
     * Perform the internal processing required to invalidate this session,
     * without triggering an exception if the session has already expired.
     *
     * @param notify Should we notify listeners about the demise of
     *  this session?
     */
    public void expire(boolean notify) {

        // Check to see if expire is in progress or has previously been called
        if (expiring || !isValid)
            return;

        synchronized (this) {
            // Check again, now we are inside the sync so this code only runs once
            // Double check locking - expiring and isValid need to be volatile
            if (expiring || !isValid)
                return;

            expiring = true;
            setValid(false);
            manager.remove(this, true);//在管理对象中讲这个session object删除(内部也是map实现的)

            // 此处nofity标示是否在注销session的时候发送Evnet给listener,典型的观察者pattern
            if (notify) {
                fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null);
            }

            expiring = false;

            // Unbind any objects associated with this session
            String keys[] = keys();
            for (int i = 0; i < keys.length; i++)
                removeAttributeInternal(keys[i], notify);

        }

    }

 

 

Note that:这段代码就是对specification的标准实现 我精简了一些,从code中学习到了一些知识

(1)如何扩展specification

(2)多线程争用,这个invalid其实是存在多线程mutex操作的。如果一个Thread_A将标志修改了,Thread_B一定要及时知道,所以对操作加以synchronized,对信号量如expiring variable采取volatile修饰保证内存可见性

(3)对于notification, 运用经典的观察者pattern

(4)其实tomcat的session实现还用到了外观等其他design pattern.(面试必背设计模式啊,哈哈)

(5)Map的组合应用(这个地球人都知道,我就不说了)

 

(2) timeout 注销

这个timeout最近深有体会,因为项目设计多线程并发,所以不确定因素很多,比如测试ftp connection等,也不能一直让它retrieve啊,哈哈,相信大家比我理解的深刻。

 

web app中大家都会配置timeout, 比如写在code中 或者xml中的session-timeout node里面,下面share下我学习的内部实现

 

容器类ContainerBase开始启动(tomcat定义了一套组件的lifecycle管理的,还没学习完),然后初始化init方法中开始做一些准备,最后会start一个thread来进行timeout check 的工作(this thread is a daemon thread)

具体的逻辑处理看code

 

    /**
     * Execute a periodic task, such as reloading, etc. This method will be
     * invoked inside the classloading context of this container. Unexpected
     * throwables will be caught and logged.
     */
    @Override
    public void backgroundProcess() {
        if (!getState().isAvailable())
            return;

        if (cluster != null) {...}
        if (loader != null)  {...}          
        if (manager != null) {
            manager.backgroundProcess();              
        }
       //下面做一些pipe的信息处理和事件动作,不是重点就不说了
    }

 

 

manager是session的管理对象,此处会调用它的处理逻辑,code如下

 

    /**
     * 此处比较有创意,是说这个Container被框架每调用6次,就会check一次session timeout 6次是默认的数值
     */
    @Override
    public void backgroundProcess() {
        count = (count + 1) % processExpiresFrequency;
        if (count == 0)
            processExpires();
    }

 核心check timeout的逻辑就很简单了,上次access的时间和这次access的时间间隔是否大于我们定义的timeout.

 

学习到的东东:

(1)lifecycle

(2)线程执行方式

(3)模块化分类,code编码等等

 

nowtime=2012-11-24 3:28pm

cost = nowtime - starttime = 31min

 

用了30多分钟,失败,下篇一定要控制在30min-

 

有说的不对的地方请指教, 本文绝对原创,如需转载,注明出处(估计没人看)

分享到:
评论

相关推荐

    HttpSession的使用

    每个`HttpSession`都有一个生命周期,当用户关闭浏览器、手动清除session或者服务器达到预设的超时时,session会失效。默认情况下,session的超时时间为30分钟,但可以通过在web.xml配置文件中设置`&lt;session-config&gt;...

    httpSession

    在Web开发中,httpSession是服务器用于跟踪用户状态的一种机制。由于HTTP协议本身是无状态的,即服务器无法识别连续发送请求的同一客户端,因此引入了session来解决这个问题。 在Web应用程序中,当用户打开浏览器...

    spring websocket获取httpsession

    在Spring框架中,WebSocket是一种用于实现双向通信的技术,它可以提供实时、低延迟的数据传输,而HttpSession则是HTTP协议中用于跟踪用户会话的一种机制。在Spring 4版本中,我们经常需要结合WebSocket与HttpSession...

    httpsession实现验证码登录小实例

    验证码(CAPTCHA)是一种防止恶意机器人或自动化程序非法访问网站的安全机制,它要求用户输入图片上显示的一组随机字符。这个小实例将帮助我们理解如何在实际应用中结合Java、session以及验证码技术。 首先,我们...

    WebSocket区分不同客户端两种方法(HttpSession和@PathParam)

    `HttpSession`是Java Servlet API中提供的一种机制,用于在一次会话过程中存储用户的数据。在一个Web应用程序中,每个用户的浏览器与服务器之间的交互都可以通过一个唯一的`HttpSession`对象来标识。因此,利用`...

    利用HttpSession实现Ajax请求重定向.docx

    HttpSession 实现 Ajax 请求重定向 标题:利用 HttpSession实现Ajax请求重定向 描述:如何在 Ajax 请求正常执行的情况下,实现网页重定向 标签:Ajax 重定向 HttpSession post 在本文中,我们将探讨如何使用 ...

    session失效

    在Java Web开发中,可以通过调用`HttpSession`接口中的`setMaxInactiveInterval()`方法来设定Session的最大非活动间隔。具体而言: 1. **默认值与配置文件**: 当未显式调用`setMaxInactiveInterval()`方法时,默认...

    servlet-api.jar 适用于import javax.servlet.http.HttpSession;异常

    servlet-api.jar 适用于import javax.servlet.http.HttpSession;异常 直接下载后直接导入 即可,

    ServletHttpSession DEMO

    下面我们将深入探讨ServletHttpSession的相关知识点。 **1. HTTP协议的无状态性** HTTP协议本身是无状态的,这意味着每次客户端向服务器发送请求,服务器处理完后就不再保留任何关于这个请求的信息。为了在多个请求...

    session在httphandler失效

    总之,理解和解决"session在httphandler失效"的问题需要深入理解ASP.NET Session的工作机制,以及HTTPHandler的特性。通过仔细排查上述可能原因,并针对性地进行修复,通常可以恢复Session在HTTPHandler中的正常功能...

    HttpSession基于Redis,支持RESTful API .zip

    HttpSession基于Redis,支持RESTful API。RedisHttpSessionRedisHttpSession提供了一种将http session透明地存储在redis中的方法,从而允许多客户端共享session。特征RESTful API - RedisHttpSession 允许在标头中...

    HTTPSession-开源

    HTTP协议提供了多种身份验证机制,如Basic Auth、Digest Auth和OAuth等。HTTPSession库支持这些认证方式,简化了在Java应用中集成安全验证的过程。开发者可以通过库提供的API,方便地处理授权请求,确保客户端与...

    Cookie机制和Session机制

    6. **特定编程语言中的实现**:例如Java中的`HttpSession`接口。 #### 三、HTTP协议与状态保持 HTTP协议设计之初是无状态的,即每个请求都是独立的,不存在上下文依赖。但是随着Web应用的发展,需要在客户端与...

    Web_4_状态管理Cookie和HttpSession1

    状态管理的两种常见模式是Cookie和HttpSession。Cookie是一种客户端状态管理技术,它将状态信息存储在用户的浏览器中。服务器通过在HTTP响应头中添加`Set-Cookie`字段,向浏览器发送Cookie,浏览器则会在后续的请求...

    设置Session失效的几种方法

    本文介绍了设置Session失效的几种方法,包括在主页面或公共页面中设置Session失效时间、在项目的web.xml中设置Session失效时间、直接在应用服务器中设置Session失效时间等。此外,还介绍了如何在Session失效后执行一...

    Java中设置session超时(失效)的三种方法

    这时可以使用HttpSession接口提供的setMaxInactiveInterval方法。此方法接受一个整型参数,表示session无效的最大间隔时间,单位是秒。例如,想要设置session在30分钟(1800秒)后失效,可以这样编写代码: ```java...

    利用Token机制解决重复重复提交

    ### 利用Token机制解决重复提交问题 在Web应用开发中,防止表单的重复提交是一个常见的需求。本文将深入探讨如何通过Token机制来解决这一问题,并提供详细的实现步骤及原理解析。 #### 一、Token机制简介 Token...

    session机制与cookie机制(来源于IT168)

    【标题】:“session机制与cookie机制(来源于IT168)” 【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session...

    在WebSphereApplicationServerV7集群环境中管理HTTPsession.pdf

    在WebSphereApplicationServerV7集群环境中管理HTTPsession.pdf

Global site tag (gtag.js) - Google Analytics