java定时刷新_Java API token定时刷新

该博客介绍了一个Java实现的TokenManager类,用于定时刷新API Token。TokenManager使用ScheduledExecutorService进行定时任务调度,每29天刷新一次。类中包含初始化、设置线程池大小、销毁以及获取Token的方法。

package com.gwzx.gwzxyw.baidu;

import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.ScheduledFuture;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;public classTokenManager {private static final Logger logger = LoggerFactory.getLogger(this.getClass());private staticScheduledExecutorService scheduledExecutorService;private static Map tokenMap = new LinkedHashMap();private static Map> futureMap = new HashMap>();private static int poolSize = 2;private static boolean daemon =Boolean.TRUE;/**

* 初始化 scheduledExecutorService*/

private static voidinitScheduledExecutorService() {

logger.info("daemon:{},poolSize:{}", daemon, poolSize);

scheduledExecutorService= Executors.newScheduledThreadPool(poolSize, newThreadFactory() {

@OverridepublicThread newThread(Runnable arg0) {

Thread thread=Executors.defaultThreadFactory().newThread(arg0);//设置守护线程

thread.setDaemon(daemon);returnthread;

}

});

}/**

* 设置线程池

*

* @param poolSize poolSize*/

public static void setPoolSize(intpoolSize) {

BaiduTokenManager.poolSize=poolSize;

}/**

* 设置线程方式

*

* @param daemon daemon*/

public static voidsetDaemon(boolean daemon) {

BaiduTokenManager.daemon=daemon;

}/**

* 初始化token 刷新,每29天分钟刷新一次。

*

* @param access_token access_token*/

public static voidinit(final String apiKey, final String secretKey) {

init(apiKey, secretKey,0, 60 * 60 * 12 * 29);

}/**

* 初始化token 刷新,每29天分钟刷新一次。

*

* @param access_token access_token

* @param initialDelay 首次执行延迟(秒)

* @param delay 执行间隔(秒)*/

public static void init(final String apiKey, final String secretKey, int initialDelay, intdelay) {if (scheduledExecutorService == null) {

initScheduledExecutorService();

}if(futureMap.containsKey(apiKey)) {

futureMap.get(apiKey).cancel(true);

}//立即执行一次

if (initialDelay == 0) {

doRun(apiKey, secretKey);

}

ScheduledFuture> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(newRunnable() {

@Overridepublic voidrun() {

doRun(apiKey, secretKey);

}

}, initialDelay== 0 ?delay : initialDelay, delay, TimeUnit.SECONDS);

futureMap.put(apiKey, scheduledFuture);

logger.info("apiKey:{}", apiKey);

}private static voiddoRun(final String apiKey, final String secretKey) {try{

String access_token=AuthService.getAuth(apiKey, secretKey);

tokenMap.put(apiKey, access_token);

logger.info("access_token refurbish with apiKey:{}", apiKey);

}catch(Exception e) {

logger.error("access_token refurbish error with apiKey:{}", apiKey);

e.printStackTrace();

}

}/**

* 取消 token 刷新*/

public static voiddestroyed() {

scheduledExecutorService.shutdownNow();

logger.info("destroyed");

}/**

* 取消刷新

*

* @param access_token access_token*/

public static voiddestroyed(String access_token) {if(futureMap.containsKey(access_token)) {

futureMap.get(access_token).cancel(true);

logger.info("destroyed appid:{}", access_token);

}

}/**

* 获取

* @param access_token access_token

* @return token*/

public staticString getToken(String access_token) {return tokenMap.get(access_token);

}/**

* access_token

* @return token*/

public staticString getDefaultToken() {

Object[] objs=tokenMap.values().toArray();return objs.length > 0 ? objs[0].toString() : null;

}

}

### 获取海康威视API中的access_token的方法 海康威视的API通常需要使用access_token进行身份验证,以确保请求的安全性和合法性。获取access_token的过程通常涉及使用AK/SK(Access Key和Secret Key)进行签名认证,或者通过OAuth等协议获取。 #### 1. 使用AK/SK认证方式获取access_token 海康威视的某些API接口支持通过AK/SK进行认证,进而获取access_token。具体步骤如下: - **构造请求URL**:通常,获取access_tokenAPI地址类似于`https://openapi.example.com/token`,具体URL需要参考官方文档。 - **构造请求参数**:通常需要提供`appKey`(即Access Key)和`appSecret`(即Secret Key),这两个参数用于生成签名。 - **发送HTTP请求**:使用Java的HTTP客户端库(如Apache HttpClient或OkHttp)发送GET或POST请求,并解析返回的JSON数据以获取access_token。 以下是一个使用Java获取access_token的示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class AccessTokenFetcher { public static String getAccessToken(String appKey, String appSecret) throws Exception { String url = "https://openapi.example.com/token?appKey=" + appKey + "&appSecret=" + appSecret; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置请求方法 con.setRequestMethod("GET"); // 获取响应代码 int responseCode = con.getResponseCode(); System.out.println("Sending GET request to URL: " + url); System.out.println("Response Code: " + responseCode); // 读取响应内容 BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 解析JSON响应,提取access_token // 这里假设返回的JSON格式为 {"accessToken":"xxx", "expireTime":3600} String jsonResponse = response.toString(); // 使用JSON解析库(如Jackson或Gson)解析JSON字符串 // 例如:JsonNode jsonNode = objectMapper.readTree(jsonResponse); // String accessToken = jsonNode.get("accessToken").asText(); String accessToken = "mocked-access-token"; // 替换为实际解析结果 return accessToken; } public static void main(String[] args) { try { String appKey = "your-app-key"; String appSecret = "your-app-secret"; String accessToken = getAccessToken(appKey, appSecret); System.out.println("Access Token: " + accessToken); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 2. 存储刷新access_token 由于access_token的有效期通常较短(如2小时),因此需要在应用中实现自动刷新机制。可以采用以下策略: - **定时刷新**:使用定时任务(如ScheduledExecutorService)定期调用获取access_token的接口。 - **缓存存储**:将access_token存储在内存或持久化存储中,确保在多个请求之间可以复用。 - **异常处理**:在API调用时捕获access_token过期的错误,并自动触发刷新流程。 ### 注意事项 - **安全性**:确保appKey和appSecret的安全性,避免泄露。可以考虑将这些敏感信息存储在安全的配置文件或环境变量中。 - **错误处理**:在获取access_token时,可能会遇到网络问题或API限流等情况,需实现重试机制。 - **日志记录**:记录获取access_token的过程,便于调试和监控。 ### 相关问题 1. 如何在Java中解析JSON响应以提取access_token? 2. 如何实现定时刷新access_token的机制? 3. 如何处理access_token过期时的自动刷新逻辑? 4. 如何确保appKey和appSecret的安全性? 5. 如何在分布式系统中管理access_token的缓存?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值