使用guava過期map


最近需要將微信的accesstoken保存到緩存里面,防止重復請求微信接口獲取token,造成token請求次數超標,其實隨便一個緩存都可以輕松解決,但是現有的環境中沒有redis,沒有memcahe,做一個這個小功能,不需要引入這些框架,就用guava的過期map就可以了,不要要是服務宕機了,可又要重新獲取了,這個...不再考慮范圍內了.

依賴包:

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>

Cache這個類有很多,防止導錯,給出包名:

import com.alibaba.fastjson.JSON;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

聲明全局靜態變量Cache

private static Cache<String, String> cache = null;

設置過期時間,一般微信的token過期時間是7200s,我設的短一些:

    /**
     * 緩存其accessToken 和 ticketToken 的值
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static String getTicketToken(String key) throws Exception{
        if (Objects.isNull(cache) || getCacheAccessToken(key).equals(WeChatConstant.TICKET_TOKEN)){
            Gson gson = new Gson();
            cache =  CacheBuilder.newBuilder().expireAfterWrite(7100,TimeUnit.SECONDS).build();
            String accessToken = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+WeChatConstant.APPID +"&secret="+WeChatConstant.SECRET;
            String httpResult = getHttpResult(accessToken);
            log.info("獲取的accesstoken:{}",httpResult);
            System.out.println("----"+accessToken+"----");
            AccessToken aT = gson.fromJson(accessToken, AccessToken.class);
            String signUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+aT.getAccess_token()+"&type=jsapi";
            String resultSign = getHttpResult(signUrl);
            TicketToken ticket = gson.fromJson(resultSign, TicketToken.class);
            log.info("生成的ticket:{},值是:{}",ticket,ticket.getTicket());
            cache.put(WeChatConstant.TICKET_TOKEN,ticket.getTicket());
            log.info("重新生成accessToken:{},{}",accessToken,new Date(System.currentTimeMillis()));
            return ticket.getTicket();
        }else{
            return getCacheAccessToken(key);
        }
    }

 

    /**
     * token失效,返回key值
     *
     * @param key
     * @return
     * @throws ExecutionException
     */
    private static String getCacheAccessToken(String key) throws ExecutionException {
        return cache.get(key, () -> {
            return key;
        });
    }

    /**
     * 隨機加密
     * @param hash
     * @return
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    /**
     * 獲取訪問地址鏈接返回值
     */
    private static String getHttpResult(String url) {
        String result = "";
        HttpGet httpRequest = new HttpGet(url);
        try {
            HttpResponse httpResponse = HttpClients.createDefault().execute(httpRequest);
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                result = EntityUtils.toString(httpResponse.getEntity());
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            result = e.getMessage().toString();
        } catch (IOException e) {
            e.printStackTrace();
            result = e.getMessage().toString();
        }
        return result;
    }
    /**
     * 產生隨機串--由程序自己隨機產生
     * @return
     */
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }
    /**
     * 由程序自己獲取當前時間
     * @return
     */
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }

  給出兩個json轉換的實體類:

/**
 * @author zhangyi
 * @date 2019/2/11 17:19
 */
@Data
public class AccessToken {
    private String access_token;
    private Integer expires_in;
}

  

/**
 * @author zhangyi
 * @date 2019/2/11 17:25
 */
@Data
public class TicketToken {

    private Integer errcode;

    private String errmsg;

    private String ticket;

    private Integer expires_in;

}

常量:

    /**
     * 第三方用戶唯一憑證即appsecret
     */
    public static final String SECRET = "";

    /**
     * 第三方用戶唯一憑證密鑰,
     */
    public static final String APPID = "";

    /**
     * 微信access_token
     */
    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";
    /**
     * 微信ticket_token
     */
    public static final String TICKET_TOKEN = "TICKET_TOKEN";

至此完成這個功能就不需要引入框架,直接使用這個工具類就可以完成了,俗話說:殺雞焉用宰牛刀,哈哈,希望可以幫到各位

 


免責聲明!

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



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