使用微信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);

单例设计模式全局缓存accessToken的更多相关文章

  1. GOF设计模式之1:单例设计模式

    1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单 ...

  2. 【iOS 单例设计模式】底层解析与运用

    [iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司   单例实例 - 管理 ...

  3. iOS开发之单例设计模式(完整正确版本)

    单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...

  4. Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式

    (一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00.    2.该类的很多方法都已经过时,不 ...

  5. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

  6. 转:java单例设计模式

    本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...

  7. java单例设计模式总结及举例

    * 设计模式:前人总结出来的经验,被后人直接拿来使用. * 单例设计模式:一个类只允许有一个对象,将这个对象作为一个全局的访问点,提供出去供大家使用. * 分析: * 1.用户只能有一个对象 * 2. ...

  8. java—单例设计模式

    单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 1.构造方法私有化 2.声明一个本类对象 3.给外部提供一个静态方法获取对象实例 什么时候使用? 1.通过在工具类的设计中使用: ...

  9. IOS设计模式第二篇之单例设计模式

    现在我们的组件已经有组织了.你需要从其他的地方得到数据,你也可以创建一个API类管理数据这个下个设计模式单例里面介绍. 这个单例设计模式确保这个类仅仅拥有一个实例,并且为这个实例提供一个全局的访问点. ...

随机推荐

  1. Zookeeper 的学习与运用

    引子 云计算越来越流行的今天,单一机器处理能力已经不能满足我们的需求,不得不采用大量的服务集群.服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,这些信息如何推送到各个节点? ...

  2. Something you need to perform after RedHat 6.x installed

    Something you need to perform after RedHat 6.x installed YUM Repos % yum update % rpm -Uvh http://do ...

  3. IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic

    IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic.                     @synth ...

  4. 原生js事件委托

    var commontop = document.getElementById("commontop");commontop.onclick = function(ev){   v ...

  5. Python os._exit() sys.exit()

    os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那么python解释器将会退出.如果 ...

  6. apriori推荐算法

    大数据时代开始流行推荐算法,所以作者写了一篇教程来介绍apriori推荐算法. 推荐算法大致分为: 基于物品和用户本身 基于关联规则 基于模型的推荐 基于物品和用户本身 基于物品和用户本身的,这种推荐 ...

  7. 【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)

    windbg简介 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能 ...

  8. zabbix3.0安装【server】

    关于zabbix的介绍,就不多说了,功能强大,架构前卫,自己直接去官网研究 在这里,还是秉承研究一个应用或者技术,都要自己动手安装部署,实战操作,才能深入掌握,基于这个精神,zabbix从安装部署开始 ...

  9. 显示intent和隐示intent有什么区别

    显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent. 隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent. 说明:And ...

  10. 如何在 Delphi 中静态链接 SQLite

    搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上 下载测试工程 下面说说方法 1.当 ...