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