使用微信JS-SDK开发的小伙伴们,看文档常常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 数据库
这句话就是:开发者必须在本身的服务全局缓存access_token,jsapi_ticket设计模式
下面就使用单例模式进行全局缓存。(固然你也能够存入数据库,即所谓的实例化。而后每次从数据库取,而后弄个定时器定时刷新,楼主之前使用的这种方式,可是发现实在在浪费时间,浪费精力,不建议使用。就把下面这种不错的方式提供给你们。)api
单例模式:顾名思义,就是系统中的一个类只有一个实例。不管有多少个类在调用它,它都是一个。这样在各个类进行调用的时候,取到的数据是共用的。缓存
/** * @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);微信