需求就是自己写了一个微信公众平台开发的小玩意,使用SSM框架,由于请求时基本都需要access_token,所以我让所有的controller都继承了一个BaseController:
public class BaseController {
protected Logger logger = LoggerFactory.getLogger(getClass());
private static String access_token = null;
public String getAccess_token(){
if (access_token == null) {
StringBuilder url = new StringBuilder();
url.append("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential");
url.append("&appid=").append(GlobalStatic.APPID);
url.append("&secret=").append(GlobalStatic.SECRET);
String result = WebUtils.sendGet(url.toString());
JSONObject json = JSON.parseObject(result);
access_token = (String) json.get("access_token");
}
return access_token;
}
}
修改后的版本:
public class BaseController {
protected Logger logger = LoggerFactory.getLogger(getClass());
public String getAccess_token(){
return BaseHolder.access_token;
}
private static class BaseHolder{
private static String access_token = getAccess_token();
private static String getAccess_token(){
StringBuilder url = new StringBuilder();
url.append("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential");
url.append("&appid=").append(GlobalStatic.APPID);
url.append("&secret=").append(GlobalStatic.SECRET);
String result = WebUtils.sendGet(url.toString());
JSONObject json = JSON.parseObject(result);
access_token = (String) json.get("access_token");
return access_token;
}
}
}
这里有三个问题:
1.修改后的版本能否解决多线程访问重复请求access_token问题?(基于servlet的请求本来就是多线程吧)
2.关于access_token两小时过期,如何解决?
3.微信提供的接口在页面上直接访问存在跨域请求的问题,那么我转移到系统里模拟请求,页面先请求自己的系统,由自己的系统发起请求再去微信服务器。这个方法感觉不太合理,请求数据需要再包装,返回数据有时也要再处理。有什么好的解决方法没有?
请前辈们赐教!
1.重复的获取的问题:
(1):设置为同步
(2):在每次获取的时候,确认在容器里里面是否已经存在。
2.accessToken 过期怎么办:
(1) 每次请求时,判断是否过期
(2)单独线程解决。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。