微信处理access_token全局缓存的问题
最早的时候,因为不需要太多微信jsapi的支持,使用access_token的机会很少, 所以一直没有有处理缓存的问题。但是后来添加微信分享和扫描二维码的时候,token的使用量激增导致有时候调试2,3个小时, token得访问上线就打到了 。 本来是想将token存到库中 , 每次读库这样实现。但是在网上看到别人说可以用单例的方式来实现, 既简单又方便。使用时 ,直接从map中取出参数就可以。 尝试一下非常好用。现将代码分享出来。
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 }