为什么须要给token做持久化,试想如果存储token的做事器宕机后,用户信息也会伴随着失落效,用户须要重新上岸来获取token,难免降落了用户体验,以是我们须要像处理session分布式一样,将token持久化。
我的案例是将token存储到redis里。
实在springboot已经帮我们封装了太多的东西了,在,我们只须要添加不到10行代码,就可以实现redis的持久化。
1. 新增 TokenStoreConfig.java
/ 把token存到redis Created by Fant.J. /@Configurationpublic class TokenStoreConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public TokenStore redisTokenStore(){ return new RedisTokenStore(redisConnectionFactory); }}2. 新增 application.properties
spring.redis.database=0# Redis做事器地址spring.redis.host=47.xx4.xx9.xx# Redis做事器连接端口spring.redis.port=6379# Redis做事器连接密码(默认为空)spring.redis.password=root# 连接池最大连接数(利用负值表示没有限定)spring.redis.pool.max-active=8# 连接池最大壅塞等待韶光(利用负值表示没有限定)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=03. 修正 MyAuthorizationServerConfig.java
//新增一个注入 @Autowired private TokenStore tokenStore; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints .tokenStore(tokenStore) //新增这一行 .authenticationManager(authenticationManager) .userDetailsService(userDetailsService); }
好了,token在redis里面的存储就完成了。这么大略的吗?对,便是这么大略,由于springboot包装的很好了,如果检测到认证做事,它会先从tokenStore获取对应的token数据,如果tokenStore没有,则新天生一个token并存入redis。
拓展那redis是怎么连接的呢?我们在第一个类中注入了RedisConnectionFactory 这个工厂,它是个接口,里面包含了关于redis连接的方法。只要你按照spring供应的默认配置属性来配置redis,成功连接是没有问题的。贴一小段连接核心源码证明一下
public RedisConnection getConnection() { if (cluster != null) { return getClusterConnection(); } Jedis jedis = fetchJedisConnector(); JedisConnection connection = (usePool ? new JedisConnection(jedis, pool, dbIndex, clientName) : new JedisConnection(jedis, null, dbIndex, clientName)); connection.setConvertPipelineAndTxResults(convertPipelineAndTxResults); return postProcessConnection(connection); }
这是RedisConnectionFactory子类工厂JedisConnectionFactory中的getConnection方法。
redis属性如何拿到的呢?package org.springframework.boot.autoconfigure.data.redis;import java.util.List;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties( prefix = \"大众spring.redis\公众)public class RedisProperties { private int database = 0; private String url; private String host = \"大众localhost\"大众; private String password; private int port = 6379; private boolean ssl; private int timeout; private RedisProperties.Pool pool; private RedisProperties.Sentinel sentinel; private RedisProperties.Cluster cluster; public RedisProperties() { }
上面是springboot获取属性配置文件的操作。
( 顺便也带给大家一个获取application.properties 属性的一个规范的方法。)
中间的装置连接池啥的就不在这说了,有兴趣的可以跟踪源码去看看大天下(不得不夸奖springboot的源码写的真是堡垒了,大略粗暴Future 和 Callback用的也是流弊的很)。以是还得自己去看去琢磨。