spring session的生命周期
Session获取
spring-session实现了HttpServletRequest的子类–SessionRepositoryRequestWrapper,由它覆盖getSession方法,将由web容器处理的逻辑接管过来。
public HttpSession getSession(boolean create) {
HttpSessionWrapper currentSession = getCurrentSession();
if(currentSession != null) {
return currentSession;
}
String requestedSessionId = getRequestedSessionId();
if(requestedSessionId != null) {
S session = sessionRepository.getSession(requestedSessionId);
if(session != null) {
this.requestedSessionIdValid = true;
currentSession = new HttpSessionWrapper(session, getServletContext());
//从数据仓库提取出来的session状态不为new
currentSession.setNew(false);
setCurrentSession(currentSession);
return currentSession;
}
}
if(!create) {
return null;
}
S session = sessionRepository.createSession();
currentSession = new HttpSessionWrapper(session, getServletContext());
setCurrentSession(currentSession);
return currentSession;
}
session id存在的情况下,如果通过session id能找到持久化的session就直接返回,否则根据create是否为true决定是否新建一个Session。Session在后续的使用中会陆续更改,添加、删除或者修改属性值。从数据仓库中提取出来的session会默认修改lastAccessTime属性以避免session失效。
数据仓库中的持久化session也存在失效时间,消费端可以通过RedisHttpSessionConfiguration.setMaxInactiveIntervalInSeconds(long timemills)来设置,默认是1800秒。redis会定时清除过期数据。
spring-session的Session实现
Spring为了将Session与具体的协议分开,单独提炼出Session实体,再通过HttpSessionWrapper将session包装起来,从而扩展HttpSession.如果以后还需要支持另外一种应用协议,就只要增加一种应用类型的wrapper就行了。
private final class HttpSessionWrapper implements HttpSession {
public HttpSessionWrapper(S session, ServletContext servletContext) {
this.session = session;
this.servletContext = servletContext;
}
//省略了大部分方法,都是委托给被包装的Session处理的
//对session坐invalidate时去数据仓库删掉对应的数据
public void invalidate() {
checkState();
this.invalidated = true;
requestedSessionInvalidated = true;
setCurrentSession(null);
sessionRepository.delete(getId());
}
public void setNew(boolean isNew) {
this.old = !isNew;
}
public boolean isNew() {
checkState();
return !old;
}
}
}
Session实体主要定义通用的getAttribute和setAttribute等方法。此外扩展了一个ExpiringSession,这是spring的默认session,它主要用来判断session是否失效。
public interface ExpiringSession extends Session {
//session的创建时间
long getCreationTime();
//session的上次访问时间
long getLastAccessedTime();
//设置最大访问间隔,超过这个间隔session会被invalidate
void setMaxInactiveIntervalInSeconds(int interval);
int getMaxInactiveIntervalInSeconds();
//session是否失效
boolean isExpired();
}
session提交
private void commitSession() {
HttpSessionWrapper wrappedSession = getCurrentSession();
if(wrappedSession == null) {
if(isInvalidateClientSession()) {
httpSessionStrategy.onInvalidateSession(this, response);
}
} else {
S session = wrappedSession.session;
sessionRepository.save(session);
if(!isRequestedSessionIdValid() || !session.getId().equals(getRequestedSessionId())) {
httpSessionStrategy.onNewSession(session, this, response);
}
}
}
- getSession时会通过setCurrentSession把新建或者提取出来的session放到request的HttpServletRequestWrapper.class.getName()属性上;相应的在session invalidate时也会将session从request里移除掉,此时通过getCurrentSession将取不到数据。
- 在做session持久化时,会首先判断session是否被invalidate,如果是则会删除
相关推荐
Spring Bean的生命周期是Spring框架中的核心概念,它涵盖了Bean从创建到销毁的全过程。了解这一过程对于优化应用程序的性能和管理资源至关重要。在Spring中,Bean的生命周期主要分为以下几个阶段: 1. **初始化阶段...
在Spring框架中,Bean的生命周期是指从创建到销毁的整个过程。这个过程包含了初始化、正常使用以及最终的销毁几个阶段。了解并掌握Spring Bean的生命周期对于优化应用性能和资源管理至关重要。接下来,我们将深入...
本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...
Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...
本项目实例旨在演示如何利用XFire来开发一个带有Session生命周期管理的Web服务。 首先,让我们深入了解XFire。XFire(现已被Apache CXF所取代)是一个轻量级的Web服务框架,它提供了快速、简单地创建和部署Web服务...
- **作用域的影响**:不同作用域(如singleton、prototype、request、session等)的Bean,其生命周期和创建方式都有所不同,需要根据应用场景选择合适的作用域。 - **懒加载**:如果Bean配置为`lazy-init="true"`,...
Spring框架是Java应用程序开发中的核心组件,其管理Bean的生命周期是其重要特性之一。Bean生命周期的理解对于优化应用性能和理解Spring内部工作原理至关重要。这里我们将深入探讨Spring的Bean生命周期、容器周期以及...
在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...
在IT行业中,尤其是在Web开发领域,session共享是一个重要的议题,特别是在分布式...在实际操作中,还需要注意安全性和性能优化,例如使用Redis的过期策略来管理session的生命周期,以及考虑在高并发场景下的性能瓶颈。
3. **Filter**: Spring Session通过`DelegatingSessionFilter`,在HTTP请求生命周期内处理session的创建、读取、更新和删除操作。这个filter会替换默认的`HttpSession`实现,确保与存储层的交互。 4. **Redis配置**...
在探讨如何通过`OpenSessionInViewFilter`来有效管理Hibernate中的Session生命周期之前,我们需要先理解Session及其生命周期的基本概念。 #### Session与生命周期 在Hibernate框架中,`Session`是执行数据库操作的...
Spring中Bean的作用域和生命周期 Spring框架中,Bean的作用域和生命周期是两个非常重要的概念,了解这两个概念对深入理解Spring框架的工作机理具有非常重要的意义。本文将对Spring中Bean的作用域和生命周期进行详细...
SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...
在IT行业中,Spring MVC是一个广泛使用的轻量级Web...记住,理解Spring MVC的工作原理,以及HTTP请求和session的生命周期,对于定位和解决这类问题至关重要。同时,使用日志和调试工具可以帮助你跟踪和分析问题的根源。
深入了解Spring中Bean的作用域和生命周期 在 Spring 框架中,Bean 的作用域和生命周期是两个非常重要的概念,它们决定了 Bean 的实例化和生命周期。了解 Spring 中 Bean 的作用域和生命周期是非常重要的,这将有助...
- `Session`是短生命周期的,每个数据库操作开始时创建,完成后关闭,避免长时间持有导致资源浪费。 3. **Spring中的HibernateTemplate** - `HibernateTemplate`是Spring提供的一个便捷工具,它封装了`Session`的...
在Spring Boot框架中,Bean是核心组件,它们的生命周期管理是Spring框架的重要特性之一。本文将深入探讨"bean的生命周期分析(五)"这一主题,重点关注Spring Boot如何创建、初始化、使用以及销毁Bean,以及开发者...
配置完成后,Spring Session会自动接管HttpSession的生命周期,每当有Session数据发生变化时,会自动将其保存到Redis中。这样,无论用户请求落在哪个服务器实例上,都能从Redis中获取到一致的Session数据。 使用...
在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session释放模式。本文将深入探讨Hibernate Session的几种释放模式,以及它们在实际开发中的应用和优缺点。 ...
这个训练资源"Spring_Dependency_Injection_Training"旨在帮助开发者深入理解Spring框架中的依赖注入和Spring Bean的生命周期管理,从而提升你的编程技能。 依赖注入是一种编程实践,它允许组件之间解耦,使得代码...