首先要想通过Redis进行会话管理和缓存的话 就要实现这些各类 Cache、CacheManager、CachingSessionDao都是shiro里面的类。
讲一下在写代码中遇到的坑
1.序列化和反序列化的问题
序列化的问题主要是体现在对session的id进行序列化的时候会出现一个问题,可以利用Apache的common的lang3组件里面有对序列化操作的工具类。但是我在处理的过程中出现了一个小bug,还不知道原因是什么,这边说一下,经过RedisSessionDao操作后,在Redis里面存储了一个session,但是其key值很奇怪,在我写的key值前面还加了一些内容,当时不知道怎么回事,后来通过对key值进行处理,才解决了这个问题。
处理代码:
private byte[] getByteKey(Object k){ if(k instanceof String){ String key = PREFIX+k; return key.getBytes(); }else { return SerializationUtils.serialize((Serializable) k); } }
2.会话管理和缓存执行的顺序的问题
这里要说一下,Redis的会话管理主要是为了能够做到服务器集群的,所以其 主要作用是对Redis的时间进行设置的,在进行RedisSessionDao操作之后shiro还会进行缓存设置,也就是再在Redis上面设置session,所以2个key值要一样,不然会出现2个session,会导致一些小问题。这里要讲一下授权,授权会通过Redis缓存,把数据缓存到Redis上面,他的key值一般是对象。
3.会话管理的一些小问题
如果你要用Redis实现会话管理,就必须要自己实现Redis的缓存,这样才可以使用Redis的会话管理;当你只要缓存的时候可以不去实现会话管理,用shiro提供的默认会话管理也是可以的。
下面就献上我的代码:
pom.xml文件
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.11.3.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.11</version> </dependency> <!--谷歌的验证码--> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
shiro配置
import com.google.code.kaptcha.servlet.KaptchaServlet; import com.youxiong.dao.UserReposisty; import com.youxiong.domain.Permission; import com.youxiong.domain.Role; import com.youxiong.domain.UserInfo; import com.youxiong.filter.FormValid; import com.youxiong.redis.JedisCacheManager; import com.youxiong.redis.RedisSessionDao<