全局缓存accessToken

package cn.itcast.core.util.weixin;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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() {
        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 {
       
           //实际中这里要改为你自己调用微信接口去获取accessToken和jsapiticket
        accessToken = GZopenId.getAtoken();
        jsapiticket = GZopenId.getJSApiTicket(accessToken);
            //将信息放置缓存中
            map.put("time", nowDate + "");
            map.put("access_token", String.valueOf(accessToken));
            map.put("jsapiticket", String.valueOf(jsapiticket));
            //为返回结果赋值
            result.put("access_token", accessToken);
            result.put("jsapiticket", jsapiticket);
            }
        return result;
    }

}

//最后获取获取jsapiTicket
Map<String, Object> accessTokenAndJsapiTicket = Singleton.getInstance().getAccessTokenAndJsapiTicket();
String jsapi_ticket = (String) accessTokenAndJsapiTicket.get("jsapiticket");
Map<String, String> sign = GZopenId.getSign(pd.get("url").toString(), jsapi_ticket);
map.put("sign", sign);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Spring Boot 中使用 Java 代码获取钉钉的 accessToken 并将其缓存缓存中,你可以这样做: 1. 首先,你需要在你的 pom.xml 文件中添加对钉钉开放平台的依赖,以便你可以使用钉钉的 Java SDK 调用钉钉的 API。 ```xml <dependency> <groupId>com.dingtalk</groupId> <artifactId>dingtalk-sdk</artifactId> <version>4.3.14</version> </dependency> ``` 2. 然后,你需要在你的项目中创建一个配置类,用来存储你的钉钉应用的 appId 和 appSecret。 ```java @Configuration public class DingTalkConfiguration { @Value("${dingtalk.appId}") private String appId; @Value("${dingtalk.appSecret}") private String appSecret; @Bean public DingTalkClient dingTalkClient() { return new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); } @Bean public OapiGettokenRequest gettokenRequest() { OapiGettokenRequest request = new OapiGettokenRequest(); request.setAppid(appId); request.setAppsecret(appSecret); request.setHttpMethod("GET"); return request; } } ``` 3. 然后,你需要创建一个 AccessTokenService 类,用来获取 accessToken 并将其缓存缓存中。 ```java @Service public class AccessTokenService { @Autowired private DingTalkClient dingTalkClient; @Autowired private OapiGettokenRequest gettokenRequest; @Autowired private CacheManager cacheManager; private static final String ACCESS_TOKEN_CACHE_NAME = "accessTokenCache"; public String getAccessToken() throws ApiException { Cache cache = cacheManager.getCache(ACCESS_TOKEN_CACHE_NAME); String accessToken = cache.get("accessToken", String.class); if (accessToken != null) { return accessToken; } OapiGettokenResponse response = dingTalkClient.execute(gettokenRequest); accessToken = response.getAccessToken(); cache.put("accessToken", accessToken); return accessToken; ### 回答2: 要使用Java代码获取钉钉的accessToken缓存到Spring Boot缓存中,可以按照以下步骤进行: 1. 创建一个Spring Boot项目,并确保已经引入所需的依赖,如spring-boot-starter-cache和dingtalk-sdk-java。 2. 在Spring Boot配置文件(application.yml或application.properties)中配置钉钉的相关信息,包括appKey、appSecret和accessToken缓存配置。 3. 创建一个获取accessToken的方法,并使用钉钉sdk提供的接口来获取accessToken。代码示例如下: ```java import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.request.OapiGettokenRequest; import com.dingtalk.api.response.OapiGettokenResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class AccessTokenService { @Resource private DingTalkProperties dingTalkProperties; @Cacheable(value = "accessTokenCache", key = "'accessToken'") public String getAccessToken() throws ApiException { DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); OapiGettokenRequest request = new OapiGettokenRequest(); request.setAppkey(dingTalkProperties.getAppKey()); request.setAppsecret(dingTalkProperties.getAppSecret()); request.setHttpMethod("GET"); OapiGettokenResponse response = client.execute(request); return response.getAccessToken(); } } ``` 4. 在需要使用accessToken的地方注入AccessTokenService,并调用getAccessToken方法来获取accessToken。 ```java @Service public class SomeService { @Autowired private AccessTokenService accessTokenService; public void doSomething() { try { String accessToken = accessTokenService.getAccessToken(); // 使用accessToken进行相应的操作 } catch (ApiException e) { // 处理异常 } } } ``` 5. 配置Spring Boot缓存的相关信息,可以选择使用内存缓存、Redis等作为缓存实现。 6. 启动Spring Boot应用程序,当第一次调用getAccessToken方法时,会从钉钉接口获取accessToken,并缓存缓存中。之后的调用会直接从缓存中获取accessToken,提高系统性能。 以上就是使用Java代码获取钉钉的accessToken缓存到Spring Boot缓存中的步骤。当accessToken过期或失效时,会自动重新获取并更新到缓存中,保证系统的正常运行。 ### 回答3: 要使用Java代码获取钉钉的accessToken缓存到Spring Boot缓存中,你需要按照以下步骤进行操作: 1. 创建一个Java类,命名为DingTalkAccessTokenUtil,用于获取钉钉的accessToken。 2. 在DingTalkAccessTokenUtil类中,导入需要的Java包,如HttpClient、JSON等。 3. 在DingTalkAccessTokenUtil类中,定义一个静态方法,命名为getAccessToken(),用于获取accessToken。 4. 在getAccessToken()方法中,使用HttpClient发送HTTP请求,向钉钉服务器请求获取accessToken。具体的请求URL需要根据钉钉开放平台的文档进行设置。 5. 获取到accessToken后,将其缓存到Spring Boot缓存中。你可以使用Spring Boot提供的缓存注解,如@Cacheable、@CachePut等。需要在Spring Boot的配置文件中启用缓存功能。 6. 在需要使用accessToken的地方,通过调用getAccessToken()方法获取accessToken,并进行相应的操作。 以下是一个简单的实例代码: ```java import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class DingTalkAccessTokenUtil { @Cacheable(value = "accessTokenCache", key = "'accessToken'") public String getAccessToken() { // 使用RestTemplate发送HTTP请求 RestTemplate restTemplate = new RestTemplate(); String url = "https://api.dingtalk.com/gettoken?appkey=APP_KEY&appsecret=APP_SECRET"; // 请替换为实际的appkey和appsecret AccessTokenResponse response = restTemplate.getForObject(url, AccessTokenResponse.class); return response.getAccessToken(); } @Data public static class AccessTokenResponse { private String accessToken; // 其他字段... } } ``` 上述代码中,通过@Cacheable注解将accessToken缓存到Spring Boot的缓存中,key为"accessToken",这样下次再调用getAccessToken()方法时,就会从缓存中读取accessToken,而不是重新发送HTTP请求。 请注意替换实际的appkey和appsecret,并根据钉钉的文档设置正确的请求URL。同时,需要在Spring Boot的配置文件中启用缓存功能。 希望以上内容对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值