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