zoukankan      html  css  js  c++  java
  • WxJava使用lettuce客户端的redis实现微信access_token等接口重复利用

    WxJava使用lettuce客户端的redis实现微信access_token等接口重复利用

    在使用WxJava进行微信开发时,有时候会存在调用微信接口获取access_token到达上限的情况,这时候就需要使用到缓存来保存这些access_token以达到重复利用的目的,WxJava 也提供了相关的实现类WxMaRedisConfigImpl,但是这个是基于jedis客户端的实现,最新版本的springboot-redis都开始采用lettuce客户端进行连接了,所以我们只能自己手动实现一个类似于WxMaRedisConfigImpl的类

    具体实现代码如下

    public class WxMaLettuceRedisConfigImpl extends WxMaDefaultConfigImpl {
    
        private StringRedisTemplate stringRedisTemplate;
    
        private static final String ACCESS_TOKEN_KEY = "wa:access_token:";
    
        private String accessTokenKey;
    
        public WxMaLettuceRedisConfigImpl(StringRedisTemplate stringRedisTemplate){
            this.stringRedisTemplate = stringRedisTemplate;
        }
    
        /**
         * 每个公众号生成独有的存储key.
         */
        @Override
        public void setAppid(String appId) {
            super.setAppid(appId);
            this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId);
        }
    
        @Override
        public String getAccessToken() {
            return stringRedisTemplate.opsForValue().get(accessTokenKey);
        }
    
        @Override
        public boolean isAccessTokenExpired() {
            Long expireTime = stringRedisTemplate.getExpire(accessTokenKey);
            if (ObjectUtils.isEmpty(expireTime)) {
                return true;
            }
            // 到期时间小于2秒就算作过期了,就重新调用接口获取
            return expireTime < 2;
        }
    
        @Override
        public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
            stringRedisTemplate.opsForValue().set(accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS);
        }
    
        @Override
        public void expireAccessToken() {
            stringRedisTemplate.expire(accessTokenKey, 0, TimeUnit.SECONDS);
        }
    
    
        @Override
        public long getExpiresTime() {
            Long expire = stringRedisTemplate.getExpire(accessTokenKey);
            return expire == null ? 0 : expire;
        }
    
        @Override
        public void setExpiresTime(long expiresTime) {
            stringRedisTemplate.expire(accessTokenKey, expiresTime, TimeUnit.SECONDS);
        }
    }
    

    详细示例已上传gitee,地址:https://gitee.com/welitis/blog_code/tree/master/wxjava-redis-demo

  • 相关阅读:
    利用CSS3中的clac()实现按照屏幕分辨率自适应宽度
    没有被广泛采用的box-sizing属性
    HTML5学习笔记(四):关于表格
    HTML5学习笔记(三):标识文本的语义元素
    浏览器内核及相关
    oracle,如何查看视图结构,获得视图中的字段名称、字段类型、字段长度等。
    存一个工作中常用的类
    将字符串序列化Object格式
    让你的博客不再单调 --博客园设置随机背景图片教程
    新的模板新的开始
  • 原文地址:https://www.cnblogs.com/welisit/p/14212416.html
Copyright © 2011-2022 走看看