工作纪实_22-搭建分布式项目时使用spring-session替代token( 二 )


zer解析的信息
@Overridepublic List> readCookieValues(HttpServletRequest request) {Cookie[] cookies = request.getCookies();List> matchingCookieValues = new ArrayList<>();if (cookies != null) {for (Cookie cookie : cookies) {if (this.cookieName.equals(cookie.getName())) {String sessionId = (this.useBase64Encoding ? base64Decode(cookie.getValue()) : cookie.getValue());if (sessionId == null) {continue;}if (this.jvmRoute != null && sessionId.endsWith(this.jvmRoute)) {sessionId = sessionId.substring(0, sessionId.length() - this.jvmRoute.length());}matchingCookieValues.add(sessionId);}}}return matchingCookieValues;}
解析出的但是这还不够,这只能判断,客户端存有用户登录的信息key,不能保证在服务器端也是登录的状态,那么这就需要做一个对比:携带的信息----> 分布式服务redis中存储的集合做比对,肯定这个项目,不仅仅只有你一个人登录,对吧,别人也可以登录,这样,redis里面存在很多的用户登录信息,但是,我们只需要找出其中一个,能够与匹配的就可以证明,这个请求的客户端,已经登录!比对逻辑,也是在源码中,我们继续看上面代码的注释,可以找到逻辑证明!
中有对ter.this..()做具体的实现,关注类中的以下2个方法:
private RedisSession getSession(String id, boolean allowExpired) {Map entries = getSessionBoundHashOperations(id).entries();if (entries.isEmpty()) {return null;}MapSession loaded = loadSession(id, entries);if (!allowExpired && loaded.isExpired()) {return null;}RedisSession result = new RedisSession(loaded, false);result.originalLastAccessTime = loaded.getLastAccessedTime();return result;}private MapSession loadSession(String id, Map entries) {MapSession loaded = new MapSession(id);for (Map.Entry entry : entries.entrySet()) {String key = (String) entry.getKey();if (RedisSessionMapper.CREATION_TIME_KEY.equals(key)) {loaded.setCreationTime(Instant.ofEpochMilli((long) entry.getValue()));}else if (RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY.equals(key)) {loaded.setMaxInactiveInterval(Duration.ofSeconds((int) entry.getValue()));}else if (RedisSessionMapper.LAST_ACCESSED_TIME_KEY.equals(key)) {loaded.setLastAccessedTime(Instant.ofEpochMilli((long) entry.getValue()));}else if (key.startsWith(RedisSessionMapper.ATTRIBUTE_PREFIX)) {loaded.setAttribute(key.substring(RedisSessionMapper.ATTRIBUTE_PREFIX.length()), entry.getValue());}}return loaded;}
3.生命周期 1.创建
在创建时设置3个变量、、
2.获取

工作纪实_22-搭建分布式项目时使用spring-session替代token

文章插图
应该通过( )方法来获取数据【标识不存在时是否创建】,具体步骤如下:
3.删除
在访问有效期内,每次访问都会更新的值,过期时间为+,也就是在有效期内每访问一次,有效期就向后延长,对于过期数据,一般有如下三种删除策略
4. 的数据结构
-在redis的数据结构
5.注意事项6.项目实战 1.核心包配置
org.springframework.bootspring-boot-starter-data-redisorg.springframework.securityspring-security-web5.3.6.RELEASEorg.springframework.sessionspring-session-data-redis2.4.0org.springframework.sessionspring-session-core2.4.0
2.启动配置
@Slf4j// redisNamespace不同服务设置不同的namcespace//maxInactiveIntervalInSeconds-默认失效时间1800->30分钟,cleanupCron->定期清理会话cron表达式@EnableRedisHttpSession(redisNamespace = "spring:session:client", maxInactiveIntervalInSeconds = 1800)@Configurationpublic class RedisHttpSessionConfig {/*** 更换序列化器*/@Bean("springSessionDefaultRedisSerializer")public RedisSerializer setSerializer(){return new GenericJackson2JsonRedisSerializer();}@Beanpublic CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer = new DefaultCookieSerializer();//serializer.setCookieName("SESSIONID");serializer.setCookiePath("/");//serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");return serializer;}@Beanpublic SpringHttpSessionConfiguration springHttpSessionConfiguration() {SpringHttpSessionConfiguration ss = new SpringHttpSessionConfiguration();ss.setCookieSerializer(cookieSerializer());log.info("加载自定义SpringHttpSessionConfiguration");return ss;}}