最先的時候,由於不須要太多微信jsapi的支持,使用access_token的機會不多, 因此一直沒有有處理緩存的問題。可是後來添加微信分享和掃描二維碼的時候,token的使用量激增致使有時候調試2,3個小時, token得訪問上線就打到了 。 原本是想將token存到庫中 , 每次讀庫這樣實現。可是在網上看到別人說能夠用單例的方式來實現, 既簡單又方便。使用時 ,直接從map中取出參數就能夠。 嘗試一下很是好用。現將代碼分享出來。json
1 public class TokenSingleton { 2 //緩存accessToken 的Map ,map中包含 一個accessToken 和 緩存的時間戳 3 //固然也能夠分開成兩個屬性咯 4 5 public final static String weixin_jssdk_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; 6 7 private Map<String, String> map = new HashMap<>(); 8 9 private TokenSingleton() { 10 } 11 12 private static TokenSingleton single = null; 13 14 // 靜態工廠方法 15 public static TokenSingleton getInstance() { 16 if (single == null) { 17 single = new TokenSingleton(); 18 } 19 return single; 20 } 21 22 public Map<String, String> getMap(WeixinAccountServiceI weixinAccountService) { 23 String time = map.get("time"); 24 String accessToken = map.get("access_token"); 25 Long nowDate = new Date().getTime(); 26 27 if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 3000 * 1000) { 28 // result = accessToken; 29 System.out.println("accessToken存在,且沒有超時 , 返回單例"); 30 } else { 31 System.out.println("accessToken 超時 , 或者不存在 , 從新獲取"); 32 System.out.println("weixinAccountService : " + weixinAccountService); 33 String access_token=weixinAccountService.getNewAccessToken("gh_ab6e37102f85"); 34 //"這裏是直接調用微信的API去直接獲取 accessToken 和Jsapi_ticket 獲取"; 35 String jsapi_token = getJsapiToken(access_token); 36 //"獲取jsapi_token"; 37 map.put("time", nowDate + ""); 38 map.put("access_token", access_token); 39 map.put("jsapi_token", jsapi_token); 40 // result = access_token; 41 } 42 43 return map; 44 } 45 46 public void setMap(Map<String, String> map) { 47 this.map = map; 48 } 49 50 public static TokenSingleton getSingle() { 51 return single; 52 } 53 54 public static void setSingle(TokenSingleton single) { 55 TokenSingleton.single = single; 56 } 57 58 59 public String getJsapiToken(String accessToken){ 60 //獲取jsapi_ticket 61 System.out.println("獲取jsapi_ticket"); 62 String jsapi_Url = weixin_jssdk_ticket_url.replace("ACCESS_TOKEN", accessToken); 63 String jsapi_ticket = null; 64 net.sf.json.JSONObject jsonObject = WeixinUtil.httpRequest(jsapi_Url, "GET", null); 65 66 System.out.println("請求返回數據: " + jsonObject); 67 68 // 若是請求成功 69 if (null != jsonObject) { 70 System.out.println("jsapi_ticket : "+jsonObject); 71 jsapi_ticket=jsonObject.getString("ticket"); 72 } 73 74 return jsapi_ticket; 75 } 76 77 78 }