单例设计模式全局缓存accessToken
使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图)
这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket
下面就使用单例模式进行全局缓存。(当然你也可以存入数据库,即所谓的实例化。然后每次从数据库取,然后弄个定时器定时刷新,楼主以前使用的这种方式,但是发现实在在浪费时间,浪费精力,不建议使用。就把下面这种不错的方式提供给大家。)
单例模式:顾名思义,就是系统中的一个类只有一个实例。无论有多少个类在调用它,它都是一个。这样在各个类进行调用的时候,取到的数据是共用的。
/**
* @author xulei
* @description 单例设计模式 缓存 accessToken Jsapi_ticket
*/
public class Singleton { //缓存accessToken 的Map,map中包含 一个accessToken 和 缓存的时间戳
private Map<String, String> map = new HashMap<String,String>(); private Singleton() { } private static Singleton single = null; // 静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
} public Map<String, String> getMap() {
return map;
} public void setMap(Map<String, String> map) {
this.map = map;
} public static Singleton getSingle() {
return single;
} public static void setSingle(Singleton single) {
Singleton.single = single;
} /**
* 获取 accessToken Jsapi_ticket 已加入缓存机制
* @param appid
* @param appsecret
* @return
*/
public Map<String,Object> getAccessTokenAndJsapiTicket(String appid, String appsecret) {
Map<String,Object> result = new HashMap<String,Object>();
Singleton singleton = Singleton.getInstance();
Map<String, String> map = singleton.getMap();
String time = map.get("time");//从缓存中拿数据
String accessToken = map.get("access_token");//从缓存中拿数据
String jsapiticket = map.get("jsapiticket");//从缓存中拿数据
Long nowDate = new Date().getTime();
//这里设置过期时间 3000*1000就好了
if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 3000 * 1000) {
System.out.println("-----从缓存读取access_token:"+accessToken);
//从缓存中拿数据为返回结果赋值
result.put("access_token", accessToken);
result.put("jsapiticket", jsapiticket);
} else {
Map<String,Object> info = JsdkUtil.getJsapiticket(appid, appsecret);//实际中这里要改为你自己调用微信接口去获取accessToken和jsapiticket
//将信息放置缓存中
map.put("time", nowDate + "");
map.put("access_token", String.valueOf(info.get("access_token")));
map.put("jsapiticket", String.valueOf(info.get("jsapiticket")));
//为返回结果赋值
result.put("access_token", info.get("access_token"));
result.put("jsapiticket", info.get("jsapiticket"));
}
return result;
} }
然后在用到的地方直接:Singleton.getInstance().getAccessTokenAndJsapiTicket(appID,appsecret);
单例设计模式全局缓存accessToken的更多相关文章
- GOF设计模式之1:单例设计模式
1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单 ...
- 【iOS 单例设计模式】底层解析与运用
[iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司 单例实例 - 管理 ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式
(一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00. 2.该类的很多方法都已经过时,不 ...
- IOS中的单例设计模式
单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...
- 转:java单例设计模式
本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...
- java单例设计模式总结及举例
* 设计模式:前人总结出来的经验,被后人直接拿来使用. * 单例设计模式:一个类只允许有一个对象,将这个对象作为一个全局的访问点,提供出去供大家使用. * 分析: * 1.用户只能有一个对象 * 2. ...
- java—单例设计模式
单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 1.构造方法私有化 2.声明一个本类对象 3.给外部提供一个静态方法获取对象实例 什么时候使用? 1.通过在工具类的设计中使用: ...
- IOS设计模式第二篇之单例设计模式
现在我们的组件已经有组织了.你需要从其他的地方得到数据,你也可以创建一个API类管理数据这个下个设计模式单例里面介绍. 这个单例设计模式确保这个类仅仅拥有一个实例,并且为这个实例提供一个全局的访问点. ...
随机推荐
- CSV导入
import java.io.FileReader; import java.io.IOException; import java.util.List; import au.com.bytecode ...
- 王爽< 汇编语言>实验十二
;此乃安装程序 ;功能:将8086cpu中断类型码为0 的中断向量设置为我们编写的中断服务程序入口地址 ;该中断在除法发送溢出的时候产生 assume cs:code code segment mai ...
- shh简化
对于SSH框架中部分的操作简化我分为两大类: 一:操作 1. 在SSH的struts.xml里 name="Action类_*" class="注入的实例"(同 ...
- rsync+inotify实现自动备份
1.rsync命令 文件在不同服务器之间备份,有两种方式,一种是推,另一种是拉 推:即由主服务器推送数据到次服务器 拉:即由次服务器向主服务器要数据 一般采用拉的方式 但是这样同时多服务器备份就会分享 ...
- zip伪加密文件分析(进阶版)
作者近日偶然获得一misc题,本来以为手到擒来,毕竟这是个大家都讨论烂了的题,详情访问链接http://blog.csdn.net/ETF6996/article/details/51946250.既 ...
- c# foreach循环二维数组
假设已有二维数组 array 行4, 列4for(int i=0;i<4;i++)//行的行数{ for(int j=0;j<4;j++)//行的列数 { console.wrie( ar ...
- chrome/ie中图片底部多出几像素问题
如果给图片的父元素设置背景色,则图片的底部就会多出几像素,chrome/IE/FF中均是如此,如下图: 代码如下,就是简单的div中放张图片: <!doctype html> <ht ...
- 002. Centos7安装mysql5.5.37
下载cmake-2.8.12.2.tar.gz, 下载地址: https://pan.baidu.com/s/1qYtpX7m 下载mysql-5.5.37.tar.gz, 下载地址: http:// ...
- cookie 和session 的区别:
1.cookie数据存放在客户的浏览器上,session数据放在服务器上.2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session.3. ...
- 01 Linux档案与目录管理
1. 目录与路径 1.1绝对路径和相对路径 绝对路径:一定有根目录/写起,例如:/usr/share/doc 相对路径:不是由根目录/写起,例如:由/usr/sha ...