1.通过http请求获取登陆的唯一标识token
@Component
public class FuWaiWebSocketUtil {
private static final Logger log = LoggerFactory.getLogger(FuWaiWebSocketUtil.class);
/**
* 应用账号
*/
@Value("${fw.appkey}")
private String appkey;
/**
* 应用秘钥
*/
@Value("${fw.secret}")
private String secret;
/**
* url
*/
@Value("${fw.tts.tokenUrl}")
private String tokenUrl;
@Autowired
ICacheService cacheService;
private final static String TIME_ZONE = "GMT";
private final static String FORMAT_ISO8601 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private final static String URL_ENCODING = "UTF-8";
private static final String ALGORITHM_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
static class Token{
/**
* 访问令牌
*/
private String token;
/**
* 用于更新令牌的 token
*/
private String refreshToken;
/**
* 访问令牌有效时长,单位: second
*/
private int life;
public Token(String token, String refreshToken, int life) {
this.token = token;
this.refreshToken = refreshToken;
this.life = life;
}
public Token() {
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
}
public String getToken(){
if (cacheService.isExist(ASR_TTS_Constants.FU_WAI.FU_WAI_TTS_TOKEN_PREFIX)) {
String token = cacheService.getString(ASR_TTS_Constants.FU_WAI.FU_WAI_TTS_TOKEN_PREFIX);
log.info(MessageFormat.format("缓存中存在未过期的token,直接取出来使用:{0}", token));
return token;
}
Map<String, String> queryParamsMap = new HashMap<String, String>();
queryParamsMap.put("appkey", appkey);
log.info("获取的Token入参:" + queryParamsMap);
Token token = processGETRequest(queryParamsMap);
log.info("获取的Token:" + token);
if (token != null) {
log.info("获取的Token:" + token + ", 有效期时间戳(秒):" + token.getLife());
cacheService.setex(ASR_TTS_Constants.FU_WAI.FU_WAI_TTS_TOKEN_PREFIX, token.getToken(), token.getLife());
return token.getToken();
}
return "";
}
public FuWaiWebSocketUtil.Token processGETRequest(Map<String, String> queryParamsMap) {
FuWaiWebSocketUtil.Token token=null;
try {
String result= sendGet(tokenUrl, queryParamsMap);
log.info("获取tokenhttps请求结果:"+result);
JSONObject rootObj = JSON.parseObject(result);
if (rootObj != null) {
token=new FuWaiWebSocketUtil.Token(rootObj.getString("token"),rootObj.getString("refresh_token"),rootObj.getIntValue("life"));
}
else{
log.info("提交获取Token请求失败: " + result);
}
} catch (Exception e) {
log.info("发生异常!",e);
}
return token;
}
public String sendGet(String url, Map<String, String> parameters) {
String result = "";
BufferedReader in = null;// 读取响应输入流
StringBuffer sb = new StringBuffer();// 存储参数
String params = "";// 编码之后的参数
try {
// 编码请求参数
if (parameters.size() == 1) {
for (String name : parameters.keySet()) {
sb.append(name).append("=").append(
java.net.URLEncoder.encode(parameters.get(name),
"UTF-8"));
}
params = sb.toString();
} else {
for (String name : parameters.keySet()) {
sb.append(name).append("=").append(
java.net.URLEncoder.encode(parameters.get(name),
"UTF-8")).append("&");
}
String temp_params = sb.toString();
params = temp_params.substring(0, temp_params.length() - 1);
}
String full_url = url + "?" + params;
log.info("HTTPS请求链接:" + full_url);
SslUtils.ignoreSsl();
// 创建URL对象
URL connURL = new URL(full_url);
// 打开URL连接
HttpURLConnection httpConn = (HttpURLConnection) connURL
.openConnection();
// 设置通用属性
httpConn.setRequestProperty("Accept", "*/*");
httpConn.setRequestProperty("Connection", "Keep-Alive");
httpConn.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
String sign = appkey+":"+secret;
String encode = Base64.encodeBase64String(sign.getBytes(StandardCharsets.UTF_8));
httpConn.setRequestProperty("Authorization", "Basic "+encode);
// 建立实际的连接
httpConn.connect();
// 响应头部获取
Map<String, List<String>> headers = httpConn.getHeaderFields();
// 遍历所有的响应头字段
for (String key : headers.keySet()) {
log.info("------ttss获取token相应结果------");
log.info(key + "\t:\t" + headers.get(key));
}
// 定义BufferedReader输入流来读取URL的响应,并设置编码方式
in = new BufferedReader(new InputStreamReader(httpConn
.getInputStream(), "UTF-8"));
String line;
// 读取返回的内容
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
return "err: " + e.getMessage().toString();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
log.error(ex.getMessage(), ex);
}
}
return result;
}
}