- 浏览: 66901 次
- 性别:
- 来自: 成都
最新评论
-
qiaohhgz:
public static void String chang ...
一图和几句话解决java参数传值问题 -
ocaicai:
虽然我看懂了你的意思,但是我依然觉得表达得有些欠妥!
一图和几句话解决java参数传值问题 -
ql0722:
特别赞同第二条第三条
如果我再年轻几岁 -
zzc_zj:
很好的知识点,学习了
数据库查询select原理 -
dai03070609:
[url][/url][flash=200,200][/fla ...
数据库查询select原理
Chapter 9: Session Management
Catalina通过一个叫做manager的组件来支持session管理。manager是由org.apache.catalina.Manager接口表示。一个manager总是和一个context相关联的。manager负责创建、更新、销毁(使一个session失效)session对象和返回一个有效的session对象给请求组件。
servlet可以通过调用javax.servlet.http.HttpServletRequest接口的getSession方法来获取一个session对象。在默认连接器中org.apache.catalina.connector.HttpRequestBase类实现了HttpServletRequest接口。
默认情况下,manager把它的session对象存储在内存中。但是,Tomcat也可以允许manager把它的session对象持久化到存储文件或数据库中。Catalina提供org.apache.catalina.session包,这个包中包含了session对象相关的类型和session管理。
这章分三部分:"Sessions", "Managers"和"Stores"。
Sessions
在servlet编程中,一个session对象由javax.servlet.http.HttpSession接口表示。这个接口的实现是org.apache.catalina.session包下的StandardSession类。但是,出于安全考虑,manager不会传递一个StandardSession实例给一个servlet。它使用在org.apache.catalina.session包下面的facade类:StandardSessionFacade。在内部,管理器与另外一个facade:org.apache.catalina.Session一起工作。类图:
The Session Interface
Session接口作为一个Catalina内部的façade。Session接口的标准实现是StandardSession。
StandardSession也实现了javax.servlet.http.HttpSession接口。
Session对象总是被包含在一个manager里面的。setManager和getManager方法用来把一个Session实例和一个manager相关联起来。一个Session实例也有一个唯一的标识符。可以使用setId和getId方法来访问Session的标识符。manager调用getLastAccessedTime方法来确定一个Session对象是否合法有效。manager调用setValid和reset方法来设置和重新设置一个session对象为合法有效。每次一个Session实例被访问,它的access方法被调用来修改它的最后被访问时间(last accessed time)。最后,manager可以调用它的expire方法把一个session设为超时。getSession方法返回一个被这个facade包装后的HttpSession对象。
The StandardSession Class
StandardSession类是Session接口的标准实现。它除了实现了javax.servlet.http.HttpSession 和org.apache.catalina.Session,还实现了java.lang.Serializable让Session对象可以被序列化。
这个类的构造函数接收一个Manager实例,使一个Session对象总是有一个对应的Manager。
下面是一些重要的private变量。注意transient关键字修饰的变量不会被序列化。
注意在Tomcat 5中,上面的变量是protected修饰的。每个变量都有一对get/set方法。
getSession方法通过传递这个实例来创建一个StandardSessionFacade对象。
一个Session对象在一段时间内(超过了Manager里的maxInactiveInterval变量的值)没有被访问。它将被设置为超时过期。让一个Session对象超时过期,调用Session接口的expire方法。
超时处理包括了设置一个叫做expiring的内部变量、从Manager中移除Session实例和触发一些事件。
The StandardSessionFacade Class
要把一个Session对象传递给servlet,Catalina要实例化StandardSession类,填充属性,然后把它传递给servlet。它传递给一个StandardSessionFacade实例,只提供了在javax.servlet.http.HttpSession的方法实现。这样,servlet程序员就不能把HttpSession对象向下转型成StandardSessionFacade类,访问它的public方法。
Manager
manager管理是session对象的。例如:它创建session对象和让session对象失效。manager是由org.apache.catalina.Manager接口表示的。在Catalina中,org.apache.catalina.session包中包含了ManagerBase类,它提供了通用的功能的实现。ManagerBase有两个直接的子类:StandardManager和PersistentManagerBase。
当应用程序运行是时,StandardManager把session对象存储在内存中。当应用程序停止了,它把就当前在内存中所有的session对象存储到一个文件中去。当再次启动应用程序时,在从文件中把session对象加载进内存。
PersistentManagerBase类是manager组件的基类,它把session对象存储到辅助存储器里面。它有两个子类:PersistentManager和DistributedManager(DistributedManager只在Tomcat 4中),类图:
The Manager Interface
Manager接口代表了一个Manager组件:
首先,Manager接口用getContainer 和setContainer方法把Manager的实现和一个context相关联起来。createSession方法创建一个Session对象。add方法把一个Session实例添加到session池中。remove方法把Session对象从session池中移除。getMaxInactiveInterval和setMaxInactiveInterval方法返回和指定Manager将要等待用户拥有一个与该用户相关联的session的指定秒数。超过这个时间秒数,Manager将销毁这个session,即该session失效了。
最后,在Manager实现里支持一种持久化机制。load和unload方法支持把session持久化存储到辅助存储器。通过这个Manager实现,unload方法把当前活动的session存储到指定的存储地方。load方法把已被持久化的session重新加载到内存中去。
Catalina通过一个叫做manager的组件来支持session管理。manager是由org.apache.catalina.Manager接口表示。一个manager总是和一个context相关联的。manager负责创建、更新、销毁(使一个session失效)session对象和返回一个有效的session对象给请求组件。
servlet可以通过调用javax.servlet.http.HttpServletRequest接口的getSession方法来获取一个session对象。在默认连接器中org.apache.catalina.connector.HttpRequestBase类实现了HttpServletRequest接口。
public HttpSession getSession() { return (getSession(true)); } public HttpSession getSession(boolean create) { ... return doGetSession(create); } private HttpSession doGetSession(boolean create) { // There cannot be a session if no context has been assigned yet if (context == null) return (null); // Return the current session if it exists and is valid 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()); } } // Create a new session if requested and the response is not // committed if (!create) return (null); ... session = manager.createSession(); if (session != null) return (session.getSession()); else return (null); }
默认情况下,manager把它的session对象存储在内存中。但是,Tomcat也可以允许manager把它的session对象持久化到存储文件或数据库中。Catalina提供org.apache.catalina.session包,这个包中包含了session对象相关的类型和session管理。
这章分三部分:"Sessions", "Managers"和"Stores"。
Sessions
在servlet编程中,一个session对象由javax.servlet.http.HttpSession接口表示。这个接口的实现是org.apache.catalina.session包下的StandardSession类。但是,出于安全考虑,manager不会传递一个StandardSession实例给一个servlet。它使用在org.apache.catalina.session包下面的facade类:StandardSessionFacade。在内部,管理器与另外一个facade:org.apache.catalina.Session一起工作。类图:
The Session Interface
Session接口作为一个Catalina内部的façade。Session接口的标准实现是StandardSession。
StandardSession也实现了javax.servlet.http.HttpSession接口。
Listing 9.1: The Session interface package org.apache.catalina; import java.io.IOException; import java.security.Principal; import java.util.Iterator; import javax.servlet.ServletException; import javax.servlet.http.HttpSession; public interface Session { public static final String SESSION_CREATED_EVENT = "createSession"; public static final String SESSION_DESTROYED_EVENT = "destroySession"; 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 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); }
Session对象总是被包含在一个manager里面的。setManager和getManager方法用来把一个Session实例和一个manager相关联起来。一个Session实例也有一个唯一的标识符。可以使用setId和getId方法来访问Session的标识符。manager调用getLastAccessedTime方法来确定一个Session对象是否合法有效。manager调用setValid和reset方法来设置和重新设置一个session对象为合法有效。每次一个Session实例被访问,它的access方法被调用来修改它的最后被访问时间(last accessed time)。最后,manager可以调用它的expire方法把一个session设为超时。getSession方法返回一个被这个facade包装后的HttpSession对象。
The StandardSession Class
StandardSession类是Session接口的标准实现。它除了实现了javax.servlet.http.HttpSession 和org.apache.catalina.Session,还实现了java.lang.Serializable让Session对象可以被序列化。
这个类的构造函数接收一个Manager实例,使一个Session对象总是有一个对应的Manager。
public StandardSession(Manager manager);
下面是一些重要的private变量。注意transient关键字修饰的变量不会被序列化。
// session attributes private HashMap attributes = new HashMap(); // the authentication type used to authenticate our cached Principal, private transient String authType = null; private long creationTime = 0L; private transient boolean expiring = false; private transient StandardSessionFacade facade = null; private String id = null; private long lastAccessedTime = creationTime; // The session event listeners for this Session. private transient ArrayList listeners = new ArrayList(); private Manager manager = null; private int maxInactiveInterval = -1; // Flag indicating whether this session is new or not. private boolean isNew = false; private boolean isValid = false; private long thisAccessedTime = creationTime;
注意在Tomcat 5中,上面的变量是protected修饰的。每个变量都有一对get/set方法。
getSession方法通过传递这个实例来创建一个StandardSessionFacade对象。
public HttpSession getSession() { if (facade == null) facade = new StandardSessionFacade(this); return (facade); }
一个Session对象在一段时间内(超过了Manager里的maxInactiveInterval变量的值)没有被访问。它将被设置为超时过期。让一个Session对象超时过期,调用Session接口的expire方法。
Listing 9.2: The expire method public void expire(boolean notify) { // Mark this session as "being expired" if needed if (expiring) return; expiring = true; setValid(false); // Remove this session from our manager's active sessions if (manager != null) manager.remove(this); // Unbind any objects associated with this session String keys [] = keys(); for (int i = 0; i < keys.length; i++) removeAttribute(keys[i], notify); // Notify interested session event listeners if (notify) { fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null); } // Notify interested application event listeners // FIXME - Assumes we call listeners in reverse order Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); if (notify && (listeners != null)) { HttpSessionEvent event = new HttpSessionEvent(getSession()); for (int i = 0; i < listeners.length; i++) { int j = (listeners.length - 1) - i; if (!(listeners[j] instanceof HttpSessionListener)) continue; HttpSessionListener listener = (HttpSessionListener) listeners[j]; try { fireContainerEvent(context, "beforeSessionDestroyed", listener); listener.sessionDestroyed(event); fireContainerEvent(context, "afterSessionDestroyed", listener); } catch (Throwable t) { try { fireContainerEvent(context, "afterSessionDestroyed", listener); } catch (Exception e) { ; } // FIXME - should we do anything besides log these? log(sm.getString("standardSession.sessionEvent"), t); } } } // We have completed expire of this session expiring = false; if ((manager != null) && (manager instanceof ManagerBase)) { recycle(); } }
超时处理包括了设置一个叫做expiring的内部变量、从Manager中移除Session实例和触发一些事件。
The StandardSessionFacade Class
要把一个Session对象传递给servlet,Catalina要实例化StandardSession类,填充属性,然后把它传递给servlet。它传递给一个StandardSessionFacade实例,只提供了在javax.servlet.http.HttpSession的方法实现。这样,servlet程序员就不能把HttpSession对象向下转型成StandardSessionFacade类,访问它的public方法。
Manager
manager管理是session对象的。例如:它创建session对象和让session对象失效。manager是由org.apache.catalina.Manager接口表示的。在Catalina中,org.apache.catalina.session包中包含了ManagerBase类,它提供了通用的功能的实现。ManagerBase有两个直接的子类:StandardManager和PersistentManagerBase。
当应用程序运行是时,StandardManager把session对象存储在内存中。当应用程序停止了,它把就当前在内存中所有的session对象存储到一个文件中去。当再次启动应用程序时,在从文件中把session对象加载进内存。
PersistentManagerBase类是manager组件的基类,它把session对象存储到辅助存储器里面。它有两个子类:PersistentManager和DistributedManager(DistributedManager只在Tomcat 4中),类图:
The Manager Interface
Manager接口代表了一个Manager组件:
Listing 9.3: The Manager interface package org.apache.catalina; import java.beans.PropertyChangeListener; import java.io.IOException; public interface Manager { public Container getContainer(); public void setContainer(Container container); public DefaultContext getDefaultContext(); public void setDefaultContext(DefaultContext defaultContext); public boolean getDistributable(); public void setDistributable(boolean distributable); public String getInfo(); public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int interval); public void add(Session session); public void addPropertyChangeListener(PropertyChangeListener listener); public Session createSession(); public Session findSession(String id) throws IOException; public Session[] findSessions(); public void load() throws ClassNotFoundException, IOException; public void remove(Session session); public void removePropertyChangeListener(PropertyChangeListener listener); public void unload() throws IOException; }
首先,Manager接口用getContainer 和setContainer方法把Manager的实现和一个context相关联起来。createSession方法创建一个Session对象。add方法把一个Session实例添加到session池中。remove方法把Session对象从session池中移除。getMaxInactiveInterval和setMaxInactiveInterval方法返回和指定Manager将要等待用户拥有一个与该用户相关联的session的指定秒数。超过这个时间秒数,Manager将销毁这个session,即该session失效了。
最后,在Manager实现里支持一种持久化机制。load和unload方法支持把session持久化存储到辅助存储器。通过这个Manager实现,unload方法把当前活动的session存储到指定的存储地方。load方法把已被持久化的session重新加载到内存中去。
发表评论
-
MyEclipse插件安装
2012-03-22 10:05 4321:先把plugin的jar文件复制到一个文件夹下 如:C:/ ... -
Hibernate框架使用技术简述
2011-03-24 10:14 1093(1)持久化对象的操 ... -
Coder 爱翻译 How Tomcat Works 第九章 第二部分
2011-01-24 15:20 1132The ManagerBase Class ManagerB ... -
Coder 爱翻译 How Tomcat Works 第八章 第二部分
2010-12-12 18:31 1484The Loader Interface 在web应 ... -
Coder 爱翻译 How Tomcat Works 第八章 第一部分
2010-12-06 11:14 1070Chapter 8: Loader 在前几章 ... -
Coder 爱翻译 How Tomcat Works 第七章
2010-12-05 16:29 1141Chapter 7: Logger 日志是一 ... -
Coder 爱翻译 How Tomcat Works 第六章
2010-12-04 22:09 1116Chapter 6: Lifecycle Catalina是 ... -
Coder 爱翻译 How Tomcat Works 第五章 第三部分
2010-12-03 13:31 1106The Context Application 这章的第一个 ... -
Coder 爱翻译 How Tomcat Works 第五章 第二部分
2010-12-03 12:33 3070The Pipeline Interface 我们提到的Pi ... -
Coder 爱翻译 How Tomcat Works 第五章 第一部分
2010-11-28 16:36 1118Chapter 5: Container 一个容器是一个为s ... -
Coder 爱翻译 How Tomcat Works 第四章 第二部分
2010-11-27 15:07 1022Request Objects 在默认的连接器中org.ap ... -
Coder 爱翻译 How Tomcat Works 第四章 第一部分
2010-11-25 16:38 916Chapter 4: Tomcat Default Conne ... -
PreparedStatement字符串拼接
2010-11-18 17:21 1373这在里求JDBC中PreparedStatement的实现,我 ... -
HelloWorld的javap -verbose HelloWorld 字节码初探
2010-11-17 12:20 3076基本的HelloWorld类: public class ... -
How Tomcat Works 简单目录
2010-11-16 14:51 1411第1章:通过一个简单的HTTP服务器开始这本书的内容。构建一个 ... -
Coder 爱翻译 How Tomcat Works 第三章 第三部分
2010-11-15 19:24 969Parsing Headers 一个HttpHeader类 ... -
Coder 爱翻译 How Tomcat Works 第三章 第二部分
2010-11-14 20:13 1059The Connector(连接器) HttpConnect ... -
回应某面试题
2010-11-10 21:31 1279上午看了一JAVAEYE的一个上机题:http://www.i ... -
quartz简单应用
2010-11-10 11:49 963Job类:实现Job接口,接口中有一个execute()方法, ... -
coder 爱翻译 How Tomcat Works 第三章 第一部分
2010-11-05 11:41 1074第三章: Connector 在正式 ...
相关推荐
� jsp / servlet 开发人员,想了解 tomcat 内部机制的 coder ; � 想加入 tomcat 开发团队的 coder ; � web 开发人员,但对软件开发很有兴趣的 coder ; � 想要对 tomcat 进行定制的 coder 。 在阅读之前,希望...
适合读者 1.jsp/servlet 开发人员,想了解 tomcat 内部机制的 coder; 2.想加入 tomcat 开发团队的 coder; 3.web 开发人员,但对软件开发很有兴趣的 coder; 4.想要对 tomcat 进行定制的 coder。
Bad Programming Practices 101 Become a Better Coder by Learning How (Not) to Program 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
Martin, "The Clean Coder: A Code of Conduct for Professional Programmers" Prentice Hall | 2011 | ISBN: 0137081073 | 256 pages | PDF | 6 MB Programmers who endure and succeed amidst swirling ...
phpcoder安装包。 直接下载安装即可。
HDL-Coder详细教程,有详细例子,源于官方例程,中文教程
PHPCoder用于快速开发和调试PHP应用程序,它很容易扩展和定制,完全能够符合开发者的个性要求.PHPCoder是一个非常实用的,功能强大的编程环境,而且它是免费的!
HDL CODER 的用户手册,学习hdl coder参考用书,详细介绍了用simulink开发fpga的过程
MediaCoder答题器
coder的建表语句
texasinstrumentsc2000.mlpkginstall 支持TI的C2000系列工具包,要求MATLAB R2017a及其以上版本。 安装方法:打开matlab,调整路径到mlpkginstall文件所在目录;在current folder窗口里双击mlpkginstall文件即可开始...
mediacoder 5685专业版,无普通版的限制
MediaCoder使用说明文档, mediaCoder usermanual,
range coder, algorithm, compressing.
MediaCoder行业版一款针对VOD及KTV视频点播行业开发的,用于转换和处理带有多音轨内容的视频节目的软件。它具备业界领先的视频编码引擎,在高性能转码的同时保持高画质,并通过丰富的视频滤镜增强画面视觉效果。作为...
Embedded Coder用于产生嵌入式处理器、目标快速原型板和大规模生产中使用的微处理器的可读的、紧凑的、快速的C和C++代码。Embedded Coder支持附加的MATLAB Coder™和Simulink Coder™配置选项,以及对生成代码的功能...
MediaCoder-Premium-x64 MediaCoder是最早开始使用GPU进行视频编码加速的影音转码软件之一。通过将原本完全依赖CPU的计算工作转移到GPU上进行,H.264和H.265编码所需的时间被大幅缩短。
开源的AI自动生成SQL语句源代码,这款SQLCoder-70B-Alpha在文本到SQL的转换能力上超越了包括GPT-4在内的所有通用模型,它能更准确地理解你的需求,并生成相应的SQL查询。SQLCoder2和SQLCoder-7B模型已经向公众开放,...
Mediacoder 入门使用说明+各种编码常用参数设置。