`
韩悠悠
  • 浏览: 842450 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

14,tomcat session管理

 
阅读更多

Catalina通过一个叫管理器的组建来完成Session的管理。该管理器由一个接口Interface表示。
一个管理器通常和一个上下文容器相互管理,它负责创建,更新以及销毁session对象并给
任何请求组件返回一个合法的session.

一个servlet可以使用getSession方法获得一个session对象,该方法在javax.servlet.http.HttpServletRequest定义
它在默认连接器里由org.apache.catalina.connector.HttpRequestBase类实现

public HttpSession getSession() {
	return (getSession(true));
}
public HttpSession getSession(boolean create) {
	....
	return doGetSession(create);
}
private HttpSession doGetSession(boolean create) {
	if (context == null)
		return (null);
	if ((session != null) && !session.isValid())
		session = null;
	if (session != null)
		return (session.getSession());
	Manager manager = null;
	if (context != null)
		manager = context.getManager();
	if (manager == null)
		return (null);
	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());
		}
	}

	if (!create)
		return (null);
	if (session != null)
		return (session.getSession());
	else
		return (null);
}

 


默认情况下管理器将session对象存储在内存中,但是Tomcat也允许将session对象存储在文件或者数据库中(通过JDBC)

Sessions

在servlet编程中,一个session对象使用javax.servlet.http.HttpSession接口表示。该接口的标准实现是StandardSession类
由于一个Session对象常常被一个管理器持有,所以接口提供了setManager和getManager方法来关联一个Session对象和一个管理器
一个Session实例在跟管理器相关联的容器有一个唯一的ID。
StandardSession类
StandardSession类是Session接口的标准是实现。
实现了javax.servlet.http.HttpSession 和org.apache.catalina.Session之外,
它还实现了java.lang.Serializable接口来使得Session对象可序列化。
接下来是几个重要的变量在存放Session状态。注意transient使得该关键字不可序列化。
private HashMap attributes = new HashMap();
private transient String authType = null;
private transient boolean expiring = false;
private transient StandardSessionFacade facade = null;
一个Session对象如果在由maxInactiveInterval变量的时间内没有被进入则被终结。
使用Session接口中定义的expire方法可以终结一个Session对象

 

 

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();
        }

    }

 

管理器
管理器用来管理Session对象
管理器由org.apache.catalina.Manager接口表示
ManagerBase类有两个直接子类:StandardManager和PersistentManagerBase类。
在运行的时候,StandardManager将session对象存放在内存中。
但是,当停止的时候,它将Session对象存放到文件中。当它再次启动的时候,重新载入Session对象。
PersistentManagerBase类作为一个管理器组件将Session对象存放到二级存储器中。
它有两个直接子类:PersistentManager和DistributedManager类

 

分享到:
评论

相关推荐

    设定tomcat中session过期时间.txt

    在Web开发中,Session管理是确保用户状态跟踪的重要机制之一。Tomcat作为一款广泛使用的Java应用服务器及Servlet容器,提供了多种方式来设定Session的有效时长。这有助于开发者根据具体业务需求灵活调整Session的...

    tomcat-redis-session管理 使用说明

    【标题】:“Tomcat-Redis-Session管理”的实践指南 在Web应用开发中,Session管理是关键的一环,用于在用户浏览器与服务器之间保持状态。传统的Session存储方式是将数据存放在服务器内存中,但随着高并发访问和...

    tomcat session存到mencache

    在处理用户会话时,Tomcat默认使用基于内存的session管理,但这可能导致在高并发场景下session数据丢失或者性能瓶颈。为了解决这些问题,可以将Tomcat的session存储机制改为Memcache,这是一种高效、分布式的内存...

    springsession管理多台tomcatsession

    SpringSession 是一个强大的框架,它扩展了 Spring Framework 的 Session 支持,允许开发者在分布式环境中管理用户会话。尤其在处理多台 Tomcat 服务器时,SpringSession 提供了一种优雅的方式来实现 session 共享,...

    tomcat8专用session管理包.rar

    标题中的“tomcat8专用session管理包.rar”指的是一个针对Tomcat 8的特定session管理解决方案,这个压缩包包含了在使用Nginx作为反向代理服务器,并与Redis结合实现负载均衡场景下,确保Tomcat应用间session数据共享...

    tomcat redis session.rar

    综上所述,"Tomcat Redis Session"是一种在分布式环境中保证用户会话一致性的解决方案,通过集成Redis和Nginx,有效地解决了Web应用集群中的Session管理难题。在实际部署中,还需要考虑系统整体架构、性能优化和运维...

    Tomcat_Session的持久化

    Tomcat_Session 的持久...Tomcat 提供了 StandardManager 和 PersistentManager 两个实现类来管理 Session,其中 PersistentManager 能够把 Session 对象保存到 Session Store 中,提供了更为灵活的 Session 管理功能。

    Tomcat8(Tomcat9)+redis实现Session共享(支持Redis集群)

    Tomcat作为最常用的Java Servlet容器,其Session管理能力直接影响到应用的性能和可扩展性。本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 ...

    tomcat-session共享

    Tomcat中的Session管理** 在单台Tomcat服务器上,Session信息默认存储在服务器的内存中。然而,当部署多个Tomcat实例时,由于每个实例都有自己的Session存储,导致Session无法跨实例共享,用户在切换服务器时可能会...

    tomcat-redis-session-manager包集合下载(tomcat8)

    综上所述,"tomcat-redis-session-manager包集合"为使用Tomcat8和JDK1.8的开发者提供了便捷的手段,通过集成Redis来增强session管理,提升应用在分布式环境下的性能和可靠性。正确配置和使用这个工具可以显著改善...

    tomcat8+memcached session共享

    7. `memcached-session-manager-tc8-1.8.3.jar`:这个是针对Tomcat 8版本的session管理器实现,确保与Tomcat 8的兼容性。 8. `minlog-1.2.jar`:这是一个简单的日志库,可能用于在处理session共享时记录和调试信息。...

    tomcat5 session 复制

    `SimpleTcpCluster` 是一个基于 TCP 的集群实现,而 `DeltaManager` 是用于处理 Session 数据更新的管理器。主要配置包括: - `tcpListenAddress`:指定接收复制数据的 IP 地址,例如 `192.168.1.55`。 - `...

    tomcat-redis-session-manager

    `tomcat-redis-session-manager`就是这样一款解决方案,它将Tomcat的session管理与Redis相结合,实现了跨服务器的session共享。 首先,让我们理解`tomcat-redis-session-manager`的核心概念。这是一个开源项目,它...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    总结起来,Tomcat-Redis-Session-Manager通过整合Redis和Tomcat,实现了高效、可靠的session管理,特别适用于需要处理高并发和分布式部署的Web应用。其提供的jar包简化了集成过程,让开发者能快速地在Tomcat7和...

    tomcat-session同步所需jar.rar_session集群共享_tomcat session

    在IT行业中,尤其是在Java Web应用领域,Tomcat服务器的session管理是至关重要的。"tomcat-session同步所需jar.rar_session集群共享_tomcat session"这个标题表明我们关注的是如何在Tomcat集群环境中实现session的...

    nginx+tomcat shiro实现多tomcat下session共享

    在单个Tomcat环境下,session管理简单,但当有多个Tomcat时,session不能直接跨服务器共享。 3. **Shiro框架**: Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能。在多Tomcat...

    Tomcat memcached Session依赖jar包

    总之,"Tomcat memcached Session依赖jar包"涉及到的是在Tomcat中使用memcached来提升Session管理效率的技术。这需要正确配置Tomcat的Session Manager,并选择合适的序列化库,如Kryo,以实现高效的数据存储和传输。...

    tomcat+memcached 管理session

    本篇文章将详细介绍如何使用`Tomcat`结合`Memcached`来实现高效的Session管理。 首先,`Memcached`作为一种高性能、分布式的内存缓存系统,能够存储包括Web应用中的Session数据在内的临时性数据。通过将Session数据...

    tomcat实现session共享

    而`tomcat-redis-session-manager-1.2-tomcat-7.jar`则是Tomcat 7的Redis session manager实现。 以下是实现步骤: 1. **配置Redis服务器**:确保你有一个运行中的Redis服务器,可以是本地或者远程。配置好服务器...

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    这是一个专门为Tomcat设计的Session管理器,它允许我们将Session存储和复制到Redis中。配置这个管理器时,我们需要在Tomcat的`context.xml`或`server.xml`文件中添加相关配置,包括Redis服务器的地址、端口、密码等...

Global site tag (gtag.js) - Google Analytics