多平台统一管理软件接口,如何实现多平台统一管理软件接口
236
2022-10-30
how tomcat works 读书笔记九 Session管理
在看本文之前,请先查阅相关Session与Cookie的资料。
Catalina通过一个叫管理器的组件来完成 session 管理工作,该组件由org.apache.catalina.Manager interface 接口表示。一个管理器通常跟一个上下文容器相关联,它负责创建、更行以及销毁 session 对象并能给任何请求组件返回一个合法的 session。
Session对象
uml图如下:
看上图,我们知道我们使用的session其实是javax.servlet. /** * 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.javax.servlet.javax.servlet.javax.servlet.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(""); out.println("
编译好的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()); } }
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~