/** * 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); }
相关推荐
显示如何使用 Spring Session 和 Spring Boot 在 Spring 4 中保护 REST API 的示例。 通过这种方式,身份验证与在标头中发送的令牌一起工作。 此示例基于有关 REST 的 Spring Session 文档中的示例。 要测试服务,...
红鸟Sessions类,用mysql数据库接管原来由文件系统支撑的php session,解决了session兼容性、虚拟主机无法自定义session等问题,内置gc函数,可以按概率触发删除过期session。 在php原始session用法不变的情况下,...
如果在ubuntu/Debian下, 采用apt安装的PHP, 那么在使用Session的时候, 就可能会有小概率遇到这个提示. 复制代码 代码如下: PHP Notice: session_start(): ps_files_cleanup_dir: opendir(/var/lib/php5) failed: ...
log-sessions-2021-08-21-041328.session
前面我们介绍了cookies,主要应用在用户登录上,保存用户登录状态,不过cookies直接放在了浏览器上,安全性较低,所以我们便引出了session功能与cookies相同,不同的是它放在了客户端,相比较cookies来说安全性更高...
$mojo_app->sessions( MojoX::Session::Simple->new({ default_expiration => 24 * 60 * 60, # 24 hours }) ); # In app.psgi, build mojo app to enable Plack::Middleware::Session::Simple. use Plack::...
log-sessions-2021-09-21-183121.session
There are many applications of the Internet that require the creation and management of a session, where a session is considered an exchange of data between an association of participants. The ...
专业版 无session限制 免费
Chapter 13: Authorizations and Sessions Chapter 14: Extended Authorization (EA) Policies Chapter 15: Key Management Chapter 16: Auditing TPM Commands Chapter 17: Decrypt/Encrypt Sessions Chapter 18: ...
引导会话 一个存储演示代码的存储库,用于介绍 Spring Session 的演讲。 大多数例子来自Rob Winch,他是老板酱和传奇人物。
从SecurtCRT迁移到XShell的工具。注意缺省目录: C:\Users\Administrator\AppData\Roaming\NetSarang\Xshell\Sessions 如果在XSell中无法找到导入的session,则将上述目录中的文件copy到缺省的Session目录。
Neovim会话管理器 ... 像:mksession一样工作,但是在g:sessions_dir保存/创建g:sessions_dir 。 :LoadSession[!] <session> require('session_manager').load_session(filename, save_current) 将删除所
MobaXterm_20.5官方版.zip_sessions99个
自从用了MobaXterm以后,才知道这个软件会比xshell好用太多,但是免费版对会话有限制,保存14个以后就不能...使用方式:下载文件后,直接放在MobaXterm的安装目录下,重启MobaXterm就可以不限制用户保存session连接了。
在使用的过程中发现,如果要在pullEvent()方法中获取参数比较麻烦,查看源码发现nl.justobjects.pushlet.servlet.Pushlet中已经将request参数传进了Session(注意是nl.justobjects.pushlet.core.Session)。...
届会Web服务的常规会话模块特征异步/等待简单的自定义存储将值存储在基于serde_json的例子sessions = { version = " 0.1 " , features = [ " memory " ] } use std :: sync :: Arc;use sessions :: * ;let config = ...
Spring Cloud Greenwich SR2官方文档 Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, ...
const StoreSession = require ( "mongoose-express-sessions" ) ( session ) mongoose . connect ( ) app . use ( session ( { secret : 's3cr37' , cookie : { maxAge : 1000 * 60 * 60 * 24 * 7 } , store : ...
configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state)....