第一步:利用RDM等redis连接工具查看相应事件,然后去网上搜索 一下,会有redis各种事件的说明,选择契合业务的事件;

第二步:创建监听处理类;

 1 package com.lechuang.auth.advice;
2
3 import com.lechuang.common.core.entity.LeChuangAuthUser;
4 import com.lechuang.common.core.entity.system.SystemUser;
5 import com.lechuang.common.core.utils.LeChuangUtil;
6 import com.lechuang.common.redis.service.RedisDBService;
7 import com.lechuang.common.redis.service.RedisService;
8 import lombok.RequiredArgsConstructor;
9 import lombok.extern.slf4j.Slf4j;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.data.redis.connection.Message;
12 import org.springframework.data.redis.connection.MessageListener;
13 import org.springframework.scheduling.annotation.Async;
14 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
15 import org.springframework.security.core.userdetails.User;
16 import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
17 import org.springframework.security.oauth2.provider.OAuth2Authentication;
18 import org.springframework.security.oauth2.provider.token.TokenStore;
19 import org.springframework.stereotype.Service;
20 import org.springframework.util.ObjectUtils;
21
22 import javax.annotation.Resource;
23 import java.lang.reflect.Field;
24 import java.util.LinkedHashMap;
25
26 /**
27 * 功能描述:Redis监听
28 * 作者:唐泽齐
29 */
30 @Slf4j
31 @Service
32 @RequiredArgsConstructor
33 public class LiveRedisKeysExpireListener implements MessageListener {
34
35 @Autowired
36 private RedisDBService redisDBService;
37 @Resource
38 private TokenStore tokenStore;
39
40 @Override
41 public void onMessage(Message message, byte[] pattern) {
42 Object o = redisDBService.getAndSet(9, "renewUser:" + message.toString(), null);
43 if(!ObjectUtils.isEmpty(o)) {
44 log.info("处理用户缓存信息更新:"+message.toString());
45 renewToken(o,message.toString());
46 } else {
47 redisDBService.del(9,"renewUser:" + message.toString());
48 }
49 }
50
51 @Async
52 void renewToken(Object o,String tokenKey) {
53 try {
54 SystemUser user = (SystemUser) o;
55 OAuth2Authentication authentication = tokenStore.readAuthentication(tokenKey);
56 UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication.getUserAuthentication();
57 LinkedHashMap details = (LinkedHashMap) token.getDetails();
58 LinkedHashMap principal = (LinkedHashMap) details.get("principal");
59
60 LeChuangAuthUser authUser = (LeChuangAuthUser) token.getPrincipal();
61
62 //更新username
63 Field username = User.class.getDeclaredField("username");
64 username.setAccessible(true);
65 username.set(authUser,user.getUsername());
66 //更新 avatar
67 authUser.setAvatar(user.getAvatar());
68 //将新凭证 写入 token
69 DefaultOAuth2AccessToken oauthtoken = new DefaultOAuth2AccessToken(tokenKey);
70 oauthtoken.setTokenType("Bearer");
71 tokenStore.storeAccessToken(oauthtoken, authentication);
72 redisDBService.del(9,"renewUser:"+tokenKey);
73 } catch (Exception e) {
74 e.printStackTrace();
75 }
76 }
77
78 }

第三步:将监听处理类加入项目环境配置中,伴随项目启动;

 1 package com.lechuang.auth.advice;
2
3 import org.springframework.context.annotation.Bean;
4 import org.springframework.context.annotation.Configuration;
5 import org.springframework.data.redis.connection.RedisConnectionFactory;
6 import org.springframework.data.redis.listener.PatternTopic;
7 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
8
9 import javax.annotation.Resource;
10
11 /**
12 * 功能描述:Redis监听配置
13 * 作者:唐泽齐
14 */
15 @Configuration
16 public class RedisListenerConfig {
17
18 @Resource
19 private LiveRedisKeysExpireListener liveRedisKeysExpireListener;
20
21 @Bean
22 RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
23 RedisMessageListenerContainer container = new RedisMessageListenerContainer();
24 container.setConnectionFactory(connectionFactory);
25 container.addMessageListener(liveRedisKeysExpireListener, new PatternTopic("__keyevent@9__:expire"));
26 return container;
27 }
28
29 }

java 监听redis事件的更多相关文章

  1. springboot使用Redis,监听Redis键过期的事件设置与使用代码

    我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行. 1.修改Redis配置文件 1.1:Windows下的Redis存在两个配置文件 修改带有servic ...

  2. Java监听模式

    说明 生活中,监听无处不在.比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐.即触发某种行为,便执行相应的动作. 组成 Java监听模式右三个部分组成 ...

  3. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

  4. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  5. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...

  6. 在Javascript中监听flash事件(转)

    在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...

  7. Fragment中监听onKey事件,没你想象的那么难。

    项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有 ...

  8. js 事件监听 冒泡事件

    js 事件监听  冒泡事件   的取消 [自己写框架时,才有可能用到] <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitiona ...

  9. 原 JS监听回车事件

    原 JS监听回车事件 发表于2年前(2014-06-04 10:16)   阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦  ...

随机推荐

  1. 【】URL中的文本IPv6地址的格式RFC2732

    RFC2732规范中URL中的文本IPv6地址的格式, 截取其中重要部分原文如下: RFC 2732 Format for Literal IPv6 Addresses in URL's Decemb ...

  2. 数学库Sage安装和使用

    什么是Sage? Sage是免费的.开源的数学软件,支持代数.几何.数论.密码学.数值计算和相关领域的研究和教学. 可以简单看成一个数学库 下载 国内地址 安装 Windows下安装 下载安装程序即可 ...

  3. windows 找不到文件gpedit.msc

    前言: 最新在装一个软件的时候,需要更改本地组的一些内容,win+R输入gpedit.msc,提示找不到文件. 解决: 第一种方法:笔者电脑是window10 家庭版,试了网上新建一个txt文件,写入 ...

  4. Hadoop常用命令及基本概念

    HADOOP 是什么? 分布式计算开源框架,其核心组件为:HDFS.MAPREDUCE.YARN Hadoop各个功能模块的理解 1. HDFS模块 HDFS负责大数据的存储,通过将大文件分块后进行分 ...

  5. 原型模式(python)

    原型模式也叫克隆模式,通过拷贝自身的属性来创建一个新的对象,基本方法就是调用copy模块下的 (浅拷贝)copy() 和(深拷贝)deepcopy() #!/usr/bin/env python3 # ...

  6. 【Java常用类】DateTimeFormatter

    DateTimeFormatter 方式一:预定义的标准格式 实例化 如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeForma ...

  7. Java库中的LocalDate类

    Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...

  8. Go语言测试:testing

    学习参考来源:https://www.liwenzhou.com/posts/Go/16_test/ go test工具 必须导入包: import "testing" go te ...

  9. vue组件实现图片的拖拽和缩放

    vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学习和钻研一下,一个好的组件必须有其必不可少的有优点:一是能提高应用开发效率.测试性.复用性等:二是组件应该是高内聚.低耦合的:三是 ...

  10. [STM32F10x] 利用定时器测量脉冲宽度

    硬件:STM32F103C8T6 平台: ARM-MDk V5.11 前面一篇文章讲过如何利用定时器测量信号的频率(见[STM32F10x] 利用定时器测量频率),使用的是定时器的捕获/比较单元(Ca ...