RedisHttpSessionConfiguration,就是这么一个类,那这个类里面很明显的可以看到,默认session有效期的时间是1800秒,也就是30分钟private Integer maxInactiveIntervalInSeconds = 1800;可以改成其他值,通过注入的方式,那这个bean的id呢就用驼峰的方式,这里的bean一定要注入,才会加载到我们的spring容器当中,即使我们不修改我们的默认session有效期,这个值我们可以改也可以不改,因为value是1800秒,但是强调的是这个bean一定要声明,我们来看一下JedisConnectionFactory这个类的源码,他实现了很多接口,最重要的是RedisConnectionFactory,有很多他的实现类,包括Lettuce,那我们用的就是JedisConnectionFactory,然后看一下这个类的属性,例如hostName是localhostprivate String hostName = "localhost";也就是hostName默认的是本机,包括默认的一个超时时间private int timeout = Protocol.DEFAULT_TIMEOUT;这里边是2000毫秒,也就是2秒,还有默认的端口,这个是哨兵的一个端口,默认的端口是6379,哨兵是什么呢,就是这个位置,public static final String DEFAULT_HOST = "localhost";public static final int DEFAULT_PORT = 6379;public static final int DEFAULT_SENTINEL_PORT = 26379;public static final int DEFAULT_TIMEOUT = 2000;private RedisSentinelConfiguration sentinelConfig;这个位置是哨兵的一个配置,哨兵就是他来监听,如果你这个节点挂了,会自动按照你配置好的策略,进行转移,这样可以提高Redis分布式集群的一个可用性,然后是密码,是否使用连接池,各种配置,然后我们要关注一下JedisShardInfo,之前我们写过一个分布式的,我们看一下这个类,它里面就是jedis这个包里面的,我们打开这个类,这个类是RedisShardedPool,这个是我们写的分片的连接池的类,private static void initPool(){JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);config.setMinIdle(minIdle);config.setTestOnBorrow(testOnBorrow);config.setTestOnReturn(testOnReturn);config.setBlockWhenExhausted(true);//连接耗尽的时候,是否阻塞,false会抛出异常,true阻塞直到超时。默认为true。JedisShardInfo info1 = new JedisShardInfo(redis1Ip,redis1Port,1000*2);JedisShardInfo info2 = new JedisShardInfo(redis2Ip,redis2Port,1000*2);List<JedisShardInfo> jedisShardInfoList = new ArrayList<JedisShardInfo>(2);jedisShardInfoList.add(info1);jedisShardInfoList.add(info2);pool = new ShardedJedisPool(config,jedisShardInfoList, Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN);}然后看一下JedisShardInfo,大家可以看到我们在初始化的时候,其实用的是一个jedisShardInfoList,这里面有两个值,info1和info2这两个节点,那我们再回来,看一下Spring提供的,说明我们这个版本分片的是不支持的,也许以后的版本会支持,当然我也看了1.3.1也是没有支持的,但是这不重要,主要讲的是我们来分析源码的,然后把Spring Session接入进来,所以我们要注入的是JedisPoolConfig,还有注入这些属性,端口,超时时间,JedisPoolConfig也是用的Jedis包里的,我们接着回来写Jedis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"><property name="maxInactiveIntervalInSeconds" value="1800" /></bean><bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"><property name="domainName" value=".happymmall.com" /><property name="useHttpOnlyCookie" value="true" /><property name="cookiePath" value="/" /><property name="cookieMaxAge" value="31536000" /></bean><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxTotal" value="20"/></bean><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="127.0.0.1" /><property name="port" value="6379" /><property name="poolConfig" ref="jedisPoolConfig" /></bean></beans>
Error creating bean with name,创建filter的时候,出现了一个异常

那这个filter是什么呢,打开这个类,Spring4.0.0里面使用了一个继承,这里有一个小bug,当然他在4.0.3里面已经修复了这个问题,我们只要把我们的Spring改成4.0.3<spring.version>4.3.0.RELEASE</spring.version>那现在要介绍一个命令,就是redis client里面的命令,这里面有很多key,我们把6379的redis flush一下,那所有的key就清空了,然后我们monitor一下,monitor是看redis的,现在我们已经monitor了flushdbkey *monitor

在我们学习排查问题的时候,用的也非常非常多,那可以看到这里已经有连接过来,其实monitor就是监听的一个日志,现在我们monitor已经启动了,我们放到这里边,缺点也比较明显,Spring Session不支持分片的list,现在我们的这个Session是Spring Session包装过的,里面的session看一下,类型是RedisOperationSessionRepository下面的RedisSession,这个RedisOperation,我们之前在文档里面看过一次,RedisOperationSessionRepository,这里面讲的就是这个类,我们一点点来,首先来个宏观认识,一会我们再进这个类里面来看,这里有一个异常,这个异常非常简单,不能够序列化

那个类呢,user这个类,其实里面使用的是Springwork里面的JDK,这里面报了一个异常,所以导致我们的redis,存储session的时候出现了异常,那我们怎么做呢,走到我们这个user类里面,我们实现一个接口,还记得我们servetResponse这个类里面,我们就实现了Serializable这么一个接口,它是可串行化的,可序列化的,那我们User也要实现这个接口,这样就OK了,同样上面GET/SET方法,我们只用user实现一下这个接口
package com.learn.pojo;import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;
import java.util.Date;
import java.util.List;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {private Integer id;private String username;private String password;private String email;private String phone;private String question;private String answer;private Integer role;private Date createTime;private Date updateTime;}
我们先把monitor打开,它会执行setAttribute,我们看一下monitor监听到的日志,刚刚我们user实现序列化接口,所以就没有异常了,也就都正常了,首先执行了HMSET,然后ADD,PEXPIRE是以毫秒数

publish是一个发布订阅,是为了后边Spring Session,来删除存储在redis里面用户session信息,然后执行了一个getall,那hmset里面,可以看一下,这个就是sessionId,然后attribute的key是currentUser,这个很明显他就是一个email,这里面x开头的都是汉字,当我们反序列化就能够拿到他了,可以看到,这个用户登陆完之后,生成了三个值,我们看最大的session,可以看到,这么一个hash结构,最后一次进入的时间,sessionAtrr,是currentUser,当前用户的一个信息,这里面我们把它改成JSON,可以看到,有一些汉字就可以看到了

乱码不用关心,因为里边用了序列化的方式,还存储了一个JAVA的类型,它是一个String类型的,包括number类型,那我们session里面的信息,我们还是把显示复原,然后这个是创建的时间,这个很简单,就是session的时间,这个很明显,在expire里边,他的TTL是1608,我们reload一下,看到了他变成了1589

我们这个key的目的,就是使我们这个session过期,因为我们在Spring里面,注入的是1800毫秒,等时间到了,这个会自然地删除,一会我们把session的有效期调一点,然后领着大家来看一下,他删除的一个过程

Spring Session实战2相关推荐

  1. Spring Session实战4

    然后来到Spring Session的配置文件,我们增加一个bean,id就是这个类defaultCookieSerializer,class就是org.springframework.session ...

  2. Spring Session实战3

    我们先把nginx的节点只配置一个tomcat,首先来到我们的命令行,修改我们的happymall.com.conf 现在负载均衡两个节点,我们把第二个节点先注释上 然后reload一下./nginx ...

  3. Spring Session实战

    在maven里面我们已经把这个类引入进来了,然后接下来我们写一个类,这个类是什么呢,就是UserController,因为UserController里面已经用Redis的方式实现了,实现的还是Sha ...

  4. Spring Security 实战干货: RBAC权限控制概念的理解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...

  5. Spring Security 实战:使用 JWT 认证访问接口

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 欢迎阅读Spring Security 实战 ...

  6. Spring Security 实战干货:实现自定义退出登录

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 上一篇对 Spring Security 所 ...

  7. Spring Session快速入门

    现在我们来学习一下Spring Session,这个Spring框架来实现,单点登陆,并且在实现的过程中,请小伙伴们思考一个问题,和我们原生实现的单点登陆有什么异同,我们要讲的一个目录,首先是讲解Sp ...

  8. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  9. Spring Security 实战:实现自定义退出登录

    1. 前言 上一篇对 Spring Security 所有内置的 Filter 进行了介绍.今天我们来实战如何安全退出应用程序. 2. 我们使用 Spring Security 登录后都做了什么 这个 ...

最新文章

  1. 摘要: Nginx 网络多并发请求的TCP网络参数做简单说明。
  2. 程序员的反击!每天一个离职小技巧
  3. 爬虫python下载-如何用Python爬虫实现百度图片自动下载?
  4. JavaScript函数小集锦
  5. 2.3.1 spring属性注入-注解注入-半注解方式-前序
  6. druid加密mysql_Druid 数据库用户密码加密 代码实现
  7. android中如何通过代码检测是否有root权限?
  8. 查询雇佣的所有员工_想要最好的员工? 让他们自己雇用
  9. [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用...
  10. springboot使用spring-data-jpa完成数据持久化
  11. 学以致用 知行合一 ——《产品管理与研发项目管理》课程有感
  12. Struts2 stracture
  13. 机器学习系列------1. GBDT算法的原理
  14. 百胜中国于香港联交所主要上市;平安健康正式收购平安智慧医疗 | 美通企业日报...
  15. Android实现 Eq的频响曲线,可以调节峰值,高低通。曲线为算法实现。
  16. 【附白皮书下载】专家黄正杰:从微笑曲线出发,思考制造业数字化转型方向
  17. [转贴]色彩调和的原理
  18. 如何下载网页上的视频和flash的方法
  19. 干货!STABLE - 一种无监督高鲁棒性图结构学习框架
  20. 2021年12月电子学会图形化四级编程题解析含答案:聪明的小猫

热门文章

  1. IIS上的web service调用AX服务问题
  2. 美国读本科出勤率低被休学,无法毕业怎么办
  3. 前端跨域问题解决方案汇总
  4. Amazon DynamoDB 概览
  5. 萌宝出街,熊孩子逆袭小小“时髦精”
  6. HTML和XHTML的区别
  7. HTML5按钮的点击态问题
  8. C#中的三种委托方式:Func委托,Action委托,Predicate委托
  9. DHCP服务器配置介绍
  10. 二叉搜索树的经典问题