网站建设技术员工资,婚庆网站建设论文,seo网络营销公司,老婆中文字幕完整版第二季做web开发的肯定都知道#xff0c;cookie和session。不过刚开始#xff0c;很多人都只是停留在概念上的理解。今天就以看得见的方式再理解一下session。通过查看tomcat源码#xff0c;可以发现sessions就是一个ConcurrentHashMap。 StandardManger负责管理session的生命周期…
做web开发的肯定都知道cookie和session。不过刚开始很多人都只是停留在概念上的理解。今天就以看得见的方式再理解一下session。通过查看tomcat源码可以发现sessions就是一个ConcurrentHashMap。 StandardManger负责管理session的生命周期。如session过期了就把它清除掉。tomcat关闭时把session信息持久化到硬盘上。tomcat启动时就把session信息加载进内存。StandardManager.doUnload方法在tomcat关闭时被调用看一下方法的逻辑 /*** Save any currently active sessions in the appropriate persistence* mechanism, if any. If persistence is not supported, this method* returns without doing anything.** exception IOException if an input/output error occurs*/protected void doUnload() throws IOException {if (log.isDebugEnabled())log.debug(Unloading persisted sessions);// Open an output stream to the specified pathname, if anyFile file file();if (file null)return;if (log.isDebugEnabled())log.debug(sm.getString(standardManager.unloading, pathname));FileOutputStream fos null;ObjectOutputStream oos null;try {fos new FileOutputStream(file.getAbsolutePath());oos new ObjectOutputStream(new BufferedOutputStream(fos));} catch (IOException e) {log.error(sm.getString(standardManager.unloading.ioe, e), e);if (oos ! null) {try {oos.close();} catch (IOException f) {;}oos null;}throw e;}// Write the number of active sessions, followed by the detailsArrayList list new ArrayList();synchronized (sessions) {if (log.isDebugEnabled())log.debug(Unloading sessions.size() sessions);try {oos.writeObject(new Integer(sessions.size()));Iterator elements sessions.values().iterator();while (elements.hasNext()) {StandardSession session (StandardSession) elements.next();list.add(session);((StandardSession) session).passivate();session.writeObjectData(oos);}} catch (IOException e) {log.error(sm.getString(standardManager.unloading.ioe, e), e);if (oos ! null) {try {oos.close();} catch (IOException f) {;}oos null;}throw e;}}// Flush and close the output streamtry {oos.flush();oos.close();oos null;} catch (IOException e) {if (oos ! null) {try {oos.close();} catch (IOException f) {;}oos null;}throw e;}// Expire all the sessions we just wroteif (log.isDebugEnabled())log.debug(Expiring list.size() persisted sessions);Iterator expires list.iterator();while (expires.hasNext()) {StandardSession session (StandardSession) expires.next();try {session.expire(false);} catch (Throwable t) {;} finally {session.recycle();}}if (log.isDebugEnabled())log.debug(Unloading complete);} 逻辑很简单就是通过文件流将sessions写到硬盘上。这个文件到底是什么样子的呢可以通过tomcat自带的host-manager来看一下打开${tomcat_root}/work/Catalina/${host}/host-manager路径SESSIONS.ser就存储着session中的数据。tomcat启动完成后会自动删除这个文件。如下图 tomcat启动的时候会把读取这个文件恢复sessions。 /*** Load any currently active sessions that were previously unloaded* to the appropriate persistence mechanism, if any. If persistence is not* supported, this method returns without doing anything.** exception ClassNotFoundException if a serialized class cannot be* found during the reload* exception IOException if an input/output error occurs*/protected void doLoad() throws ClassNotFoundException, IOException {if (log.isDebugEnabled())log.debug(Start: Loading persisted sessions);// Initialize our internal data structuressessions.clear();// Open an input stream to the specified pathname, if anyFile file file();if (file null)return;if (log.isDebugEnabled())log.debug(sm.getString(standardManager.loading, pathname));FileInputStream fis null;ObjectInputStream ois null;Loader loader null;ClassLoader classLoader null;try {fis new FileInputStream(file.getAbsolutePath());BufferedInputStream bis new BufferedInputStream(fis);if (container ! null)loader container.getLoader();if (loader ! null)classLoader loader.getClassLoader();if (classLoader ! null) {if (log.isDebugEnabled())log.debug(Creating custom object input stream for class loader );ois new CustomObjectInputStream(bis, classLoader);} else {if (log.isDebugEnabled())log.debug(Creating standard object input stream);ois new ObjectInputStream(bis);}} catch (FileNotFoundException e) {if (log.isDebugEnabled())log.debug(No persisted data file found);return;} catch (IOException e) {log.error(sm.getString(standardManager.loading.ioe, e), e);if (ois ! null) {try {ois.close();} catch (IOException f) {;}ois null;}throw e;}// Load the previously unloaded active sessionssynchronized (sessions) {try {Integer count (Integer) ois.readObject();int n count.intValue();if (log.isDebugEnabled())log.debug(Loading n persisted sessions);for (int i 0; i n; i) {StandardSession session getNewSession();session.readObjectData(ois);session.setManager(this);sessions.put(session.getIdInternal(), session);session.activate();session.endAccess();}} catch (ClassNotFoundException e) {log.error(sm.getString(standardManager.loading.cnfe, e), e);if (ois ! null) {try {ois.close();} catch (IOException f) {;}ois null;}throw e;} catch (IOException e) {log.error(sm.getString(standardManager.loading.ioe, e), e);if (ois ! null) {try {ois.close();} catch (IOException f) {;}ois null;}throw e;} finally {// Close the input streamtry {if (ois ! null)ois.close();} catch (IOException f) {// ignored}// Delete the persistent storage fileif (file ! null file.exists() )file.delete();}}if (log.isDebugEnabled())log.debug(Finish: Loading persisted sessions);} 以上整体的逻辑就是通过文件流读取SESSIONS.ser并恢复sessions。我这里提到的启动、关闭tomcat是指通过startup、shutdown命令。如果直接kill掉tomcat进程以上操作还没来得及执行进程就挂掉了。