博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
how tomcat works 9 SessionManagement
阅读量:6310 次
发布时间:2019-06-22

本文共 3963 字,大约阅读时间需要 13 分钟。

hot3.png

Catalina 通过Manager接口支持会话管理,一个Manager与一个context关联,Manager负责创建 更新 销毁session对象,也返回合格的对象给请求组件。

Servlet可以通过调用ServletRequest 接口的getSession方法获得一个session。

我们看一下实现了这个接口的HttpRequestBase 类。

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)   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 resp  // committed   if (!create)     return (null);   ...   session = manager.createSession();   if (session != null)     return (session.getSession());   else     return (null); }

默认,manager把它的session对象放在内存中,tomcat也允许manager通过jdbc持久化到数据库中。

Sessions

在servlet编程中,session代表HttpSession接口,这个接口的实现类StandardSession基于安全的考虑,manager不会传递它的实例给servlet,而是用StandardSessionFacade来代替。

session接口

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,在context中,session有唯一的标示联系到它的manager。

StandardSession类

The getSession 方法创建了一个StandardSessionFacade对象:    @Override    public HttpSession getSession() {        if (facade == null){            if (SecurityUtil.isPackageProtectionEnabled()){                final StandardSession fsession = this;                facade = AccessController.doPrivileged(                        new PrivilegedAction
(){                    @Override                    public StandardSessionFacade run(){                        return new StandardSessionFacade(fsession);                    }                });            } else {                facade = new StandardSessionFacade(this);            }        }        return (facade);    }
StandardManager类

Manager的标准实现,将session储存与内存中,实现了lifeCycle接口,它可以被启动和停止。

转载于:https://my.oschina.net/sunxuetao/blog/132686

你可能感兴趣的文章
R语言获取国内的股票数据
查看>>
Hadoop MapReduce编程 API入门系列之wordcount版本3(七)
查看>>
git命令
查看>>
Scrapy框架实现爬虫
查看>>
sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding...
查看>>
Spring MVC的一些学习笔记-入门配置和HttpMessageConverter
查看>>
RabbitMQ消息队列(二):”Hello, World“
查看>>
Python 图片转字符画
查看>>
USI和USCI的区别
查看>>
10、QT分析之WebKit
查看>>
51Nod 1080 两个数的平方和(数论,经典题)
查看>>
ambari安装调研
查看>>
Memcached全面剖析–2.理解memcached的内存存储
查看>>
Android源代码装饰模式---ContextWrapper
查看>>
jquery中包裹节点
查看>>
PotPlayer 禁止更新
查看>>
【总结】瞬时高并发(秒杀/活动)Redis方案
查看>>
广告点击率预估是怎么回事?
查看>>
剑指offer三十七之数字在排序数组中出现的次数
查看>>
JAVA-JSP内置对象之session对象
查看>>