`
m635674608
  • 浏览: 5041293 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring session spring:session:sessions:expires 源码跟踪

 
阅读更多
	/**
		 * Saves any attributes that have been changed and updates the expiration of this
		 * session.
		 */
		private void saveDelta() {
			if (this.delta.isEmpty()) {
				return;
			}
			String sessionId = getId();
			getSessionBoundHashOperations(sessionId).putAll(this.delta);
			String principalSessionKey = getSessionAttrNameKey(
					FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME);
			String securityPrincipalSessionKey = getSessionAttrNameKey(
					SPRING_SECURITY_CONTEXT);
			if (this.delta.containsKey(principalSessionKey)
					|| this.delta.containsKey(securityPrincipalSessionKey)) {
				if (this.originalPrincipalName != null) {
					String originalPrincipalRedisKey = getPrincipalKey(
							this.originalPrincipalName);
					RedisOperationsSessionRepository.this.sessionRedisOperations
							.boundSetOps(originalPrincipalRedisKey).remove(sessionId);
				}
				String principal = PRINCIPAL_NAME_RESOLVER.resolvePrincipal(this);
				this.originalPrincipalName = principal;
				if (principal != null) {
					String principalRedisKey = getPrincipalKey(principal);
					RedisOperationsSessionRepository.this.sessionRedisOperations
							.boundSetOps(principalRedisKey).add(sessionId);
				}
			}

			this.delta = new HashMap<String, Object>(this.delta.size());

			Long originalExpiration = this.originalLastAccessTime == null ? null
					: this.originalLastAccessTime + TimeUnit.SECONDS
							.toMillis(getMaxInactiveIntervalInSeconds());
			RedisOperationsSessionRepository.this.expirationPolicy
					.onExpirationUpdated(originalExpiration, this);
		}
	}

 

public void onExpirationUpdated(Long originalExpirationTimeInMilli,
			ExpiringSession session) {
		String keyToExpire = "expires:" + session.getId();
		long toExpire = roundUpToNextMinute(expiresInMillis(session));

		if (originalExpirationTimeInMilli != null) {
			long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli);
			if (toExpire != originalRoundedUp) {
				String expireKey = getExpirationKey(originalRoundedUp);
				this.redis.boundSetOps(expireKey).remove(keyToExpire);
			}
		}

		long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds();
		String sessionKey = getSessionKey(keyToExpire);

		if (sessionExpireInSeconds < 0) {
			this.redis.boundValueOps(sessionKey).append("");
			this.redis.boundValueOps(sessionKey).persist();
			this.redis.boundHashOps(getSessionKey(session.getId())).persist();
			return;
		}

		String expireKey = getExpirationKey(toExpire);
		BoundSetOperations<Object, Object> expireOperations = this.redis
				.boundSetOps(expireKey);
		expireOperations.add(keyToExpire);

		long fiveMinutesAfterExpires = sessionExpireInSeconds
				+ TimeUnit.MINUTES.toSeconds(5);

		expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
		if (sessionExpireInSeconds == 0) {
			this.redis.delete(sessionKey);
		}
		else {
			this.redis.boundValueOps(sessionKey).append("");
			this.redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds,
					TimeUnit.SECONDS);
		}
		this.redis.boundHashOps(getSessionKey(session.getId()))
				.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
	}

 

  

分享到:
评论

相关推荐

    springsession管理多台tomcatsession

    尤其在处理多台 Tomcat 服务器时,SpringSession 提供了一种优雅的方式来实现 session 共享,避免了传统的 sticky sessions 或者基于 cookie 的解决方案的局限性。在本场景中,我们将讨论如何利用 SpringSession 将 ...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    在配置类源码中,如果开发者没有为Spring Session自定义一个线程池,那么默认情况下会使用SimpleAsyncTaskExecutor作为线程池。SimpleAsyncTaskExecutor线程池的核心特性是每次调用异步方法时都会创建一个新线程,...

    spring4+redis3+nginx1实现tomcat集群session共享源码

    本文将详细介绍如何使用Spring、Redis和Nginx来实现Tomcat集群中的Session共享,以及提供相关的源码下载。 首先,我们来看Spring框架。Spring是Java开发中最流行的开源框架之一,它提供了丰富的功能和模块,包括...

    springsession-jdbc:示例应用程序展示了如何使用JDBC配置Spring Session

    执行这些脚本将创建必要的表,如 `spring_sessions` 和 `spring_session_attributes`。 4. **配置 SessionRepository** 在 Spring Boot 应用的配置类中,我们需要定义 `SessionRepository` 的实现,并注入相应的...

    spring-redis-session 自定义 key 和过期时间

    在 Spring-Redis-Session 中,默认的会话 key 是以 "spring:session:sessions:" 开头的,如果我们想自定义 key,可以通过 RedisOperationsSessionRepository 的 setKeyPrefix() 方法来实现。例如,我们可以将 key 的...

    spring-security-rest-example:如何使用 Spring Sessions 在 Spring 4 中保护 REST 服务的示例

    显示如何使用 Spring Session 和 Spring Boot 在 Spring 4 中保护 REST API 的示例。 通过这种方式,身份验证与在标头中发送的令牌一起工作。 此示例基于有关 REST 的 Spring Session 文档中的示例。 要测试服务,...

    红鸟Sessions类 v1.0

    红鸟Sessions类,用mysql数据库接管原来由文件系统支撑的php session,解决了session兼容性、虚拟主机无法自定义session等问题,内置gc函数,可以按概率触发删除过期session。 在php原始session用法不变的情况下,...

    springsessiondemo:Spring会议

    我们可以从这个项目中学习到如何配置和使用Spring Session,以及它如何与Spring Boot、Spring MVC等其他Spring生态组件集成。 在Spring Session中,主要涉及以下几个关键知识点: 1. **会话管理**:了解HTTP会话的...

    利用Spring Session和redis对Session进行共享详解

    为了解决这个问题,我们可以采用几种策略,包括 Sticky Sessions(粘滞会话)、基于Token的会话管理、以及本文重点讨论的Session共享。 Spring Session的实现步骤大致如下: 1. **添加依赖**:在项目的pom.xml文件...

    利用spring security控制同一个用户只能一次登陆

    标签“源码”表明了可能需要深入阅读和理解Spring Security的源代码来完成这个功能,“工具”可能指的是可能用到的其他辅助工具或库。然而,由于没有提供具体的技术细节和代码,以上是一种通用的实现方式。在实际...

    session的使用

    2. **Session复制与集群**:在分布式环境下,为了保证Session数据的一致性,可能需要实现Session复制或使用Session黏贴技术(如 Sticky Sessions)。 3. **Session ID的安全性**:防止Session ID被嗅探或盗取,可以...

    tomcat集群session共享解决方案

    3. **基于粘滞会话(Sticky Sessions)**:在负载均衡器层面实现,每次用户请求都会被定向到同一台服务器,确保session始终在同一个实例上处理。这种方法简单,但若该服务器故障,会导致会话丢失。此外,它限制了...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    5. **Spring Session框架**:Spring社区提供了一个名为Spring Session的项目,它支持多种后端存储(如Redis、MongoDB等),并且与Spring MVC无缝集成,简化了分布式Session的配置和使用。 6. **HTTP Session Sticky...

    (转)讲解各种session

    - Sticky Sessions:负载均衡器会记住用户请求的特定服务器,将后续请求转发给同一服务器,避免Session冲突。 - Session集中存储:使用共享的Session存储(如数据库或缓存),所有服务器都从同一位置读写Session。 ...

    Session

    标签"源码"提示我们,这篇博客可能还涉及到了Session实现的内部代码或开源库的源码分析,这可能包括对Servlet容器(如Tomcat)中Session管理的源码研究,或者是第三方库(如Spring Session)的实现原理。 至于"工具...

    Tomcat集群Session共享

    3. **Session粘滞( Sticky Sessions)方案** - 实现过程:负载均衡器根据特定策略(如Session ID)将来自同一用户的请求定向到固定的Tomcat节点。 - 优点:实现简单,减少Session同步需求。 - 缺点:单点故障,...

    前端开源库-client-sessions

    6. **API使用**:`client-sessions`库的API简洁明了,开发者可以通过`session.set(key, value)`来设置会话属性,`session.get(key)`来读取,以及`session.destroy()`来结束会话。 7. **兼容性**:`client-sessions`...

    seesion注意问题

    这可以通过Session复制或Session黏贴( Sticky Sessions)实现。复制是指将一个服务器上的Session同步到其他服务器,黏贴则是将请求定向到最初创建Session的服务器,以确保数据一致性。 4. Session的生命周期: 当...

    SessionConverter, SecurtCRT迁移到XShell的Session工具

    接下来,在XShell中,通过“文件”&gt;“导入”&gt;“Session”导入这个`.xml`文件,你的SecureCRT Sessions现在已经被成功地转换并导入到XShell中了。 **注意点** - 在导入过程中,确保XShell版本与`SessionConverter`...

    Session登录在线人

    例如,在Java中,可以使用`Enumeration&lt;Session&gt; sessions = httpContext.getActiveSessions();`获取所有活动Session,然后遍历并读取`session.getAttribute("username")`。 4. **处理会话过期**:默认情况下,...

Global site tag (gtag.js) - Google Analytics