开发者社区> 问答> 正文

springMVC中使用单例模式以及微信开发遇到的问题

需求就是自己写了一个微信公众平台开发的小玩意,使用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.微信提供的接口在页面上直接访问存在跨域请求的问题,那么我转移到系统里模拟请求,页面先请求自己的系统,由自己的系统发起请求再去微信服务器。这个方法感觉不太合理,请求数据需要再包装,返回数据有时也要再处理。有什么好的解决方法没有?

请前辈们赐教!

展开
收起
a123456678 2016-03-19 10:41:52 3112 0
1 条回答
写回答
取消 提交回答
  • 1.重复的获取的问题:

    (1):设置为同步

    (2):在每次获取的时候,确认在容器里里面是否已经存在。

    2.accessToken 过期怎么办:
    (1) 每次请求时,判断是否过期

    (2)单独线程解决。

    2019-07-17 19:07:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring框架入门 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载