知识大全 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相关参考
在web应用中对页面的访问控制通常通过程序来控制流程为登录>设置session>访问受限页面时检查session是否存在如果不存在禁止访问 对于较小型的web应用可以通过tomcat
转摘请注明出处 作者:baggio 来源: 本文地址; 关键词DataSource(数据源)Tomcat连接池 前言 本文根据实例详细介绍了如何在tomcat中配置数据源网上此类文章很
如果程序中没有设置session的过期时间那么session过期时间就会按照IIS设置的过期时间来执行IIS中session默认过期时间为分钟IIS中session时间可以更改 如果
先说session 对SESSION的争论好象一直没有停止过不过幺麽能理解SESSION的人应该占以上但还是讲讲别嫌老~ 有一些人赞
知识大全 jquery 怎么设置某一个session的生存时间
jquery怎么设置某一个session的生存时间1.在web.xml中设置5分2.在创建session时直接设置session.setMaxInactiveInterval(300);秒再接着判断,
Session共享的解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 客户端Session
JSP页面中Session对象详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Session
知识大全 oracle中process和session的关系
在SharedServer中的Process和Oracle中的Session不是一一对应的SharedServer中的Process一个对应着Oracle中的一个或者一个以上的Session 我
本篇文章是对php中session_set_save_handler函数的用法(mysql)进行了详细的分析介绍需要的朋友参考下 复制代码代码如下:<?php/*===========
Oracle技巧:用v$session 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracl