單例設計模式全局緩存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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM