• 单例设计模式全局缓存accessToken


      使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 

    这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket

    下面就使用单例模式进行全局缓存。(当然你也可以存入数据库,即所谓的实例化。然后每次从数据库取,然后弄个定时器定时刷新,楼主以前使用的这种方式,但是发现实在在浪费时间,浪费精力,不建议使用。就把下面这种不错的方式提供给大家。)

    单例模式:顾名思义,就是系统中的一个类只有一个实例。无论有多少个类在调用它,它都是一个。这样在各个类进行调用的时候,取到的数据是共用的。

    /**
     * @author xulei
     * @description 单例设计模式 缓存 accessToken Jsapi_ticket
     */
    public class Singleton {
        
        //缓存accessToken 的Map,map中包含 一个accessToken 和 缓存的时间戳
        private Map<String, String> map = new HashMap<String,String>();
    
        private Singleton() {
            
        }
    
        private static Singleton single = null;
    
        // 静态工厂方法
        public static Singleton getInstance() {
            if (single == null) {
                single = new Singleton();
            }
            return single;
        }
    
        public Map<String, String> getMap() {
            return map;
        }
    
        public void setMap(Map<String, String> map) {
            this.map = map;
        }
    
        public static Singleton getSingle() {
            return single;
        }
    
        public static void setSingle(Singleton single) {
            Singleton.single = single;
        }
        
        /**
         * 获取 accessToken Jsapi_ticket 已加入缓存机制
         * @param appid
         * @param appsecret
         * @return
         */
        public Map<String,Object> getAccessTokenAndJsapiTicket(String appid, String appsecret) {
            Map<String,Object> result = new HashMap<String,Object>();
            Singleton singleton = Singleton.getInstance();
            Map<String, String> map = singleton.getMap();
            String time = map.get("time");//从缓存中拿数据
            String accessToken = map.get("access_token");//从缓存中拿数据
            String jsapiticket = map.get("jsapiticket");//从缓存中拿数据
            Long nowDate = new Date().getTime();
            //这里设置过期时间 3000*1000就好了
            if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 3000 * 1000) {
                System.out.println("-----从缓存读取access_token:"+accessToken);
                //从缓存中拿数据为返回结果赋值
                result.put("access_token", accessToken);
                result.put("jsapiticket", jsapiticket);
            } else {
                Map<String,Object> info = JsdkUtil.getJsapiticket(appid, appsecret);//实际中这里要改为你自己调用微信接口去获取accessToken和jsapiticket
                //将信息放置缓存中
                map.put("time", nowDate + "");
                map.put("access_token", String.valueOf(info.get("access_token")));
                map.put("jsapiticket", String.valueOf(info.get("jsapiticket")));
                //为返回结果赋值
                result.put("access_token", info.get("access_token"));
                result.put("jsapiticket", info.get("jsapiticket"));
                }
            return result;
        }
    
    }


    然后在用到的地方直接:Singleton.getInstance().getAccessTokenAndJsapiTicket(appID,appsecret);

  • 相关阅读:
    Jmeter对HTTP请求压力测试、并发测试的简单使用方法
    ActiveMQ学习笔记(4)----JMS的API结构和开发步骤
    SpringBoot项目如何进行打包部署
    ActiveMQ学习笔记(3)----JMS的可靠性机制
    狗屎一样的代码!快,重构我!
    代码对比工具,我就用这 6 个!
    Spring Boot 实现定时任务的 4 种方式
    阿里巴巴26个屌炸天的开源项目,你知道几个?
    centos7添加bridge-nf-call-ip6tables出现No such file or directory
    mysql国内镜像下载网址
  • 原文地址:https://www.cnblogs.com/xu-lei/p/6108655.html
Copyright © 2020-2023  润新知