本人之前一直从事微信公众号的开发,最近遇到这么一个问题:在调用微信的各个接口的时候,需要在调用接口的时刻向微信服务器传送acces_token参数,access_token是微信公众号接口的调用凭据,access_token本身也是通过调用微信的接口得到的,但access_token的获取频率是有限制的,每天只能获取2000次,每次有效时间为120分钟,在微信开发者文档上说明如下:
那么,我们就需要将access_token缓存下来。若要将access_token缓存下来,以供全局使用,本人一下想到的是两个方法:1.使用redis、memcached等第三方工具缓存。2.使用application缓存。先说说第一种方法,第一种方法是使用第三方插件实现的,如果项目中已经搭好了插件,直接使用即可,但由于我这个项目在时间上有压力,而且更重要的一点是,我的项目先前并未使用任何缓存插件,缓存都是session级别的,而且除了access_token,没有别的全局变量,所以如果仅仅为了access_token而搭建整个缓存插件,从时间上、项目的轻量性上显得特别的不划算,所以我把目光转移到了application上了。现在来详细说说application。首先贴出代码:
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext application = webApplicationContext.getServletContext();
从以上代码看出,application是从ServletContext实例化而来,那么我们就需要了解一下ServletContext的特性。首先看看ServletContet的API文档:
ServletContext是一个全局的储存信息的空间,这意味着它在整个应用中是共享的,它的生命周期存在于服务器启动直至服务器关闭,项目运行期间,也就是它的生命周期期间。
从以上的分析可以得知,ServletContext满足这次我缓存access_token的需求,所以这次就决定用它了!
首先是实例化ServletContext:
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext application = webApplicationContext.getServletContext();
然后调用微信的接口,获取access_token,在得到access_token之后,只需要调用ServletContext的setAttribute方法缓存access_token:
application.setAttribute("accessToken", accessToken);
需要取出access_token的时候,只需调用ServletContext的getAttribute方法即可,就像调用session的方法一样,是不是很方便?
小项目在不适用redis、memcached等工具的情况下,ServletContext是一个不错的用于缓存全局变量的选择!