知识大全 tomcat的session实现原理

Posted

篇首语:学向勤中得,萤窗万卷书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 tomcat的session实现原理相关的知识,希望对你有一定的参考价值。

    服务器端实现原理        Session在服务器端具体是怎么实现的呢?我们使用session的时候一般都是这么使用的 request getSession()或者request getSession(true)         这个时候 服务器就检查是不是已经存在对应的Session对象 见HttpRequestBase类        doGetSession(boolean create)方法         if ((session != null) && !session isValid())        session = null;        if (session != null)        return (session getSession())                         // Return the requested session if it exists and is valid        Manager manager = null;        if (context != null)        manager = context getManager()         if (manager == null)        return (null) // Sessions are not supported        if (requestedSessionId != null)         try         session = manager findSession(requestedSessionId)         catch (IOException e)         session = null;                if ((session != null) && !session isValid())        session = null;        if (session != null)         return (session getSession())                         requestSessionId从哪里来呢?这个肯定是通过Session实现机制的cookie或URL重写来设置的 见HttpProcessor类中的parseHeaders(SocketInputStream input)         for (int i = ; i < cookies length; i++)         if (cookies[i] getName() equals        (Globals SESSION_COOKIE_NAME))         // Override anything requested in the URL        if (!request isRequestedSessionIdFromCookie())         // Accept only the first session id cookie        request setRequestedSessionId        (cookies[i] getValue())         request setRequestedSessionCookie(true)         request setRequestedSessionURL(false)                                         或者HttpOrocessor类中的parseRequest(SocketInputStream input OutputStream output)        // Parse any requested session ID out of the request URI        int semicolon = uri indexOf(match) //match 是 ;jsessionid= 字符串        if (semicolon >= )         String rest = uri substring(semicolon + match length())         int semicolon = rest indexOf( ; )         if (semicolon >= )         request setRequestedSessionId(rest substring( semicolon ))         rest = rest substring(semicolon )         else         request setRequestedSessionId(rest)         rest = ;                request setRequestedSessionURL(true)         uri = uri substring( semicolon) + rest;        if (debug >= )        log( Requested URL session id is +        ((HttpServletRequest) request getRequest())        getRequestedSessionId())         else         request setRequestedSessionId(null)         request setRequestedSessionURL(false)                         里面的manager findSession(requestSessionId)用于查找此会话ID对应的session对象 Tomcat实现是通过一个HashMap实现 见ManagerBase java的findSession(String id)         if (id == null)        return (null)         synchronized (sessions)         Session session = (Session) sessions get(id)         return (session)                 Session本身也是实现为一个HashMap 因为Session设计为存放key value键值对 Tomcat里面Session实现类是StandardSession 里面一个attributes属性         /**        * The collection of user data attributes associated with this Session         */        private HashMap attributes = new HashMap()         所有会话信息的存取都是通过这个属性来实现的 Session会话信息不会一直在服务器端保存 超过一定的时间期限就会被删除 这个时间期限可以在 web xml中进行设置 不设置的话会有一个默认值 Tomcat的默认值是 那么服务器端是怎么判断会话过期的呢?原理服务器会启动一个线程 一直查询所有的Session对象 检查不活动的时间是否超过设定值 如果超过就将其删除 见StandardManager类 它实现了Runnable 接口 里面的run方法如下         /**        * The background thread that checks for session timeouts and shutdown         */        public void run()                 // Loop until the termination semaphore is set        while (!threadDone)         threadSleep()         proces***pires()                                         /**        * Invalidate all sessions that have expired         */        private void proces***pires()                 long timeNow = System currentTimeMillis()         Session sessions[] = findSessions()                 for (int i = ; i < sessions length; i++)         StandardSession session = (StandardSession) sessions[i];        if (!session isValid())        continue;        int maxInactiveInterval = session getMaxInactiveInterval()         if (maxInactiveInterval < )        continue;        int timeIdle = // Truncate do not round up        (int) ((timeNow session getLastUsedTime()) / L)         if (timeIdle >= maxInactiveInterval)         try         expiredSessions++;        session expire()         catch (Throwable t)         log(sm getString( standardManager expireException ) t)                                                 Session 信息在create expire等事情的时候都会触发相应的Listener事件 从而可以对session信息进行监控 这些Listener只需要继承HttpSessionListener 并配置在web xml文件中 如下是一个监控在线会话数的Listerner:        import java util HashSet;        import javax servlet ServletContext;        import javax servlet HttpSession;        import javax servlet HttpSessionEvent;        import javax servlet HttpSessionListener;        public class MySessionListener implements HttpSessionListener         public void sessionCreated(HttpSessionEvent event)         HttpSession session = event getSession()         ServletContext application = session getServletContext()         // 在application范围由一个HashSet集保存所有的session        HashSet sessions = (HashSet) application getAttribute( sessions )         if (sessions == null)         sessions = new HashSet()         application setAttribute( sessions sessions)                 // 新创建的session均添加到HashSet集中        sessions add(session)         // 可以在别处从application范围中取出sessions集合        // 然后使用sessions size()获取当前活动的session数 即为 在线人数                 public void sessionDestroyed(HttpSessionEvent event)         HttpSession session = event getSession()         ServletContext application = session getServletContext()         HashSet sessions = (HashSet) application getAttribute( sessions )         // 销毁的session均从HashSet集中移除        sessions remove(session)                 cha138/Article/program/Java/ky/201311/28703

相关参考

知识大全 为tomcat页面设置访问权限

  在web应用中对页面的访问控制通常通过程序来控制流程为登录>设置session>访问受限页面时检查session是否存在如果不存在禁止访问  对于较小型的web应用可以通过tomcat

知识大全 详细介绍在tomcat中配置数据源原理

  转摘请注明出处  作者:baggio  来源:  本文地址;  关键词DataSource(数据源)Tomcat连接池  前言  本文根据实例详细介绍了如何在tomcat中配置数据源网上此类文章很

知识大全 asp中设置session过期时间方法总结

  如果程序中没有设置session的过期时间那么session过期时间就会按照IIS设置的过期时间来执行IIS中session默认过期时间为分钟IIS中session时间可以更改   如果

知识大全 session和cookie的最深刻理解

先说session   对SESSION的争论好象一直没有停止过不过幺麽能理解SESSION的人应该占以上但还是讲讲别嫌老~   有一些人赞

知识大全 jquery 怎么设置某一个session的生存时间

jquery怎么设置某一个session的生存时间1.在web.xml中设置5分2.在创建session时直接设置session.setMaxInactiveInterval(300);秒再接着判断,

知识大全 Session共享的解决方案

Session共享的解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  客户端Session

知识大全 JSP页面中Session对象详解

JSP页面中Session对象详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Session

知识大全 oracle中process和session的关系

  在SharedServer中的Process和Oracle中的Session不是一一对应的SharedServer中的Process一个对应着Oracle中的一个或者一个以上的Session  我

知识大全 解析php session

本篇文章是对php中session_set_save_handler函数的用法(mysql)进行了详细的分析介绍需要的朋友参考下 复制代码代码如下:<?php/*===========

知识大全 用v$session

Oracle技巧:用v$session  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracl