how tomcat works 读书笔记九 Session管理
在看本文之前,请先查阅相关Session与Cookie的资料。
这篇资料不错
http://blog.csdn.net/fangaoxin/article/details/6952954
Catalina通过一个叫管理器的组件来完毕 session 管理工作,该组件由org.apache.catalina.Manager interface 接口表示。一个管理器通常跟一个上下文容器相关联,它负责创建、更行以及销毁 session 对象并能给不论什么请求组件返回一个合法的 session。
Session对象
uml图例如以下:
看上图,我们知道我们使用的session事实上是javax.servlet.http.HttpSession接口的实现对象。
又看到了Facade,门面模式,为什么会有它呢?标准session的一些属性功能须要对外部类隐藏,所以就有了一个facade类,对他做一些包装;有一些方法标准session里有,而标准sessionfacade里就没有,比如org.apache.catalina.Session接口里的方法。
细致看这两个类,StandardSessionFacade与StandardSession。
我们非常清楚StandardSessionFacade里面应该有一个StandardSession的引用。
只是我有点不明确为什么StandardSession里面另一个StandardSessionFacade的引用?
看了凝视大概明确了:
StandardSession.java
/**
* The facade associated with this session. NOTE: This value is not
* included in the serialized version of this object.
*/
private transient StandardSessionFacade facade = null;
Catalina通过一个叫session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示。Session管理器与一个Context级别的容器相关联。
Manager
Session管理器组件负责管理Session对象,比如创建和删除Session对象。在catalina中,ManagerBase是一个工具类,提供了最主要的一些功能。
当中,StandardManager将session保存在内存里,PersistentManagerBase将session持久化到文件或数据库中(在本文中,我们仅仅介绍StandardManager)
应用程序:
先看我们的演示样例程序:
在Bootstrap里,连接器启动之前加上以下的代码;
// add a Manager
Manager manager = new StandardManager();
context.setManager(manager);
我们的servlet例如以下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter; public class SessionServlet extends HttpServlet { private static final long serialVersionUID = -446310114281616885L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("SessionServlet -- service");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>SessionServlet</title></head>");
out.println("<body>");
String value = request.getParameter("value");
HttpSession session = request.getSession(true);
out.println("<br>the previous value is " +
(String) session.getAttribute("value"));
out.println("<br>the current value is " + value);
session.setAttribute("value", value);
out.println("<br><hr>");
out.println("<form>");
out.println("New Value: <input name=value>");
out.println("<input type=submit>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}
编译好的servletclass文件放在什么地方,还用我说吗?假设不知道就先看看前面几章吧。
先上终于的结果图:
先输入33然后15最后57的效果图
这是从SessionServlet開始的时序图:
在HttpRequestBase类中的doGetSession()方法中会首先推断requestedSessionId是否为null,假设为null,才会调用manager.createSession()...
如今就有一个问题,那这个requestedSessionId是怎么来的?
事实上在本书第三章连接器那里,解析cookid的地方
parseHeaders方法下:
if (name.equals("cookie")) {
Cookie cookies[] = RequestUtil.parseCookieHeader(value);
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("jsessionid")) {
// 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);
}
}
request.addCookie(cookies[i]);
}
}
第一次请求SessionServlet的时候,自然没有jsessionid,RequestedSessionId也为空,就要manager.createSession()
第二回的时候,浏览器在Cookie里面增加了jsessionid这一项,因此后面
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());
}
}
how tomcat works 读书笔记九 Session管理的更多相关文章
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- How Tomcat Works 读书笔记 八 载入器 上
Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- How tomcat works 读书笔记十三 Host和Engine
Host Host是Context的父容器.如果想在一个tomcat上部署多个context就需要使用Host了.上下文容器的父容器是主机,但是可能有一些其它实现,没有必要的时候也可以忽略.不过在实践 ...
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- How Tomcat Works 读书笔记 八 加载器 上
Java的类加载器 具体资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- how tomcat works 读书笔记(一)----------一个简单的web服务器
http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...
- how tomcat works读书笔记 七 日志记录器
大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. packag ...
随机推荐
- C奇淫技巧,——宏神奇
一个.宏列表 当这个问题面临: 有一个标志变量.位代表对应的含义. 我们须要提供一组函数来訪问设置这些位.可是对于每一个标记位的操作函数都是相似的.若有32个位,难道要搞32套相似的操作函数么? 你或 ...
- 无需Visual Studio,5容易的 - 分为报告
总报告设计,例如RDLC.水晶报表等.,需要安装Visual Studio.由VS提供报表设计界面设计报告,由VS设计报告.NET非常方便开发者,.但对于非开发,安装4G一个VS.并且需要Licens ...
- Codeforces Round #274 (Div. 2) --A Expression
主题链接:Expression Expression time limit per test 1 second memory limit per test 256 megabytes input st ...
- CodeForces 396C 树状数组 + DFS
本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...
- 【Flume】flume于transactionCapacity和batchSize进行详细的分析和质疑的概念
我不知道你用flume读者熟悉无论这两个概念 一开始我是有点困惑,? 没感觉到transactionCapacity的作用啊? batchSize又是干啥的啊? -- -- 带着这些问题,我们深入源代 ...
- JDBC在getConnection之前为什么要调用Class.forName(转)
获取一个数据库连接的通用模板如下: String driver = "oracle.jdbc.OracleDriver"; String url = "jdbc:orac ...
- 左右margin top问题百分比值
不想说今天心情有多差! 9点多開始发现一个"bug",需求是依据屏幕高度动态调整某个div的位置.代码大概是这种. <div style="margin-top: ...
- Unity3d 实时折射和反射
这里只是张贴在实时折射和脚本反思shader, 大约NGUI第一部分请下载. 这个版本的主要缺点是折射平面部Layer必须是water层.假设有专家谁可以摆脱这一个.请记得把代码回该条,谢谢! Wat ...
- 【Linux&Unix--文件描述叙事的性格和权柄】
个人学习整理,如有不足之处,请不吝不吝赐教.转载请注明:@CSU-Max 系列博文: Linux&Unix学习第一弹 -- 文件描写叙述符与权限 L ...
- Eclipse Maven构建Spring MVC项目
工作中项目开发使用Maven管理项目的构建.打包.编译,框架採用的是Spring MVC框架,而且实现了多模块.多项目的管理.自己也简单的參与了架构的设计.对于刚開始学习的人来说,使用Maven构建项 ...