Access Token作为请求百度AI接口以及太多需要第三方平台开发接口的唯一凭据,都存在有效期的问题。而过期处理是很有必要的。

一、问题现状

Access Token的获取一般都是Https请求,涉及到跨域问题一般的解决办法就是在后台写方法进行Http请求,将获取到的结果传递到前台页面。

百度AI token请求的返回结果:

"access_token": "1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328", "expires_in": 86400

其中 expires_in 即为有效期 这里一般是一个月。过期以后,再次使用就会报错发现请求不成功。需要在使用到token的地方做过期判断,过期重新获取。

二、百度AI 官方接口问题

百度AI 接口的官方Demo中的很多接口都已经默认把token的获取添加进去了,我这边只是暂时用到了自然语言处理,jar包:(aip-java-sdk-4.4.1.jar)下载地址:(https://ai.baidu.com/sdk#nlp)发现AipNlp对象创建的时候,首先需要单例使用,避免多次重复创建token,其次最主要的是查看源码发现已经对token做了过期处理。

Calendar.add方法参数:

如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作。例如:Calendar calendar = Calendar.getInstance(); calendar .add(5,1);则表示对日期进行加一天操作

把日期提前一天,然后和token创建的时候一直到过期的时候的日期进行比较,after为true表示token过期。

三、解决办法

1、获取token的时候,服务器会把token字符串和有效期(expires_in )一起返回给您,token 默认有效期为一个月,您可以在获取到Token后在服务器做一个缓存,或者直接写入数据库,在数据库中创建token字段和创建日期字段。有效期验证可以用当前时间戳减去获取到token的时间戳与token有效期进行对比。

就是在用到token的时候做判断:现在的时间-token创建的日期<30天 即未过期 过期以后重新请求token

2、主要参考官方jar包中的解决办法。

aip-java-sdk-4.4.1.jar

官方demo涉及到多线程,多次请求token的时候需要判断token是否已经获取过,再判断是否过期。

具体在项目中如何使用要看情况,还是多看下源码学习学习,确实写的很严谨。


以下是我自己根据官方jar修改的,一个是判断是否请求过,就是token是不是存在不为null,第二个是当多次请求的时候判断token是否过期。

package com.baidu.ai;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
/*** 获取token类* * token过期处理 2018.10.24 16:34 参考官方jar*/
public class AuthService {/*** 判断token是否过期*/private static Calendar expireDate = null;private static boolean flag = false; // 是否已经获取过了public static Boolean needAuth() {Calendar c = Calendar.getInstance();c.add(5, 1); // 当前日期加一天return Boolean.valueOf(!flag || c.after(expireDate));}/*** 获取权限token* * @return 返回示例: { "access_token":*         "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",*         "expires_in": 2592000 }*/public static String getAuth() {// 官网获取的 API Key 更新为你注册的String clientId = "你注册的API Key";// 官网获取的 Secret Key 更新为你注册的String clientSecret = "你注册的Secret Key";flag = true;return getAuth(clientId, clientSecret);}/*** 获取API访问token 该token有一定的有效期,需要自行管理,当失效时需重新获取.* @param clientId  - 百度云官网获取的 API Key         * @param clientSecret - 百度云官网获取的 Securet Key       * @return assess_token   */private static String getAuth(String clientId, String clientSecret) {// 获取token地址String authHost = "https://aip.baidubce.com/oauth/2.0/token?";String getAccessTokenUrl = authHost// 1. grant_type为固定参数+ "grant_type=client_credentials"// 2. 官网获取的 API Key+ "&client_id=" + clientId// 3. 官网获取的 Secret Key+ "&client_secret=" + clientSecret;try {URL realUrl = new URL(getAccessTokenUrl);// 打开和URL之间的连接HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();connection.setRequestMethod("POST");connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.err.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String result = "";String line;while ((line = in.readLine()) != null) {result += line;}/*** 返回结果示例*/System.err.println("result:" + result);JSONObject jsonObject = new JSONObject(result);String access_token = jsonObject.getString("access_token");Integer expires_in = Integer.valueOf(jsonObject.getInt("expires_in"));System.out.println("expires_in:" + expires_in);Calendar c = Calendar.getInstance();System.out.println("现在日期:" + c.get(c.YEAR) + "/" + c.get(c.MONTH) + "/" + c.get(c.DAY_OF_MONTH));c.add(13, expires_in.intValue());System.out.println("过期日期:" + c.get(c.YEAR) + "/" + c.get(c.MONTH) + "/" + c.get(c.DAY_OF_MONTH));expireDate = c;return access_token;} catch (Exception e) {System.err.printf("获取token失败!");e.printStackTrace(System.err);}return null;}public static void main(String[] args) {System.out.println("flag:" + flag);System.out.println("needAuth():" + needAuth().booleanValue());//第一次请求if (needAuth().booleanValue()) {String access_token = getAuth();System.out.println("flag:" + flag);System.out.println("access_token:" + access_token);} else {System.out.println("token未过期,不需要重新获取");}//第二次请求if (needAuth().booleanValue()) {String access_token = getAuth();System.out.println("flag:" + flag);System.out.println("access_token:" + access_token);} else {System.out.println("token未过期,不需要重新获取");}}}

打印结果

百度AI Access Token过期处理相关推荐

  1. 【GitHub】Personal Access Token过期导致本地仓库无法直接push到远程

    自从GitHub引入access token后,clone 私人仓库到本地需要使用它否则无法push,但access token过期后,原来token clone到本地的仓库,每次push都需要输新t ...

  2. 第三方登录access token过期问题

    前几天参加面试的时候,被面试官问道第三方登录的问题,流程其实很简单,但是当面试官问为什么要保存access token,它过不过期有什么意义.当时答得不是很对,现在总结一下: 第三方登录流程 第一步: ...

  3. php 防止access token过期,微信調用接口,防止Access_token過期的方法

    大家都知道,微信中調用訂閱用戶接口中需要Access_token,而根據微信官方文檔中說明: access_token是公眾號的全局唯一票據,公眾號調用各接口時都需使用access_token.正常情 ...

  4. 获取百度开放平台Access Token,调用百度统计接口

    官方文档:http://developer.baidu.com/wiki/index.php?title=docs/oauth 获取 Access Token有几种方式 由于项目需求比较简单,这里选择 ...

  5. Access Token 与 Refresh Token【转载哒科普啊】

    Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因为, ...

  6. 百度AI学习-错误类型大全

    错误信息 错误返回格式 若请求错误,服务器将返回的JSON文本包含以下参数: error_code:错误码. error_msg:错误描述信息,帮助理解和解决发生的错误. 错误码 SDK本地检测参数返 ...

  7. Access Token获取

    百度云Access Token获取的获取 1.登陆地址:https://login.bce.baidu.com/ 2.点击右上方[黑色的圈] 3.点击[安全认证] 注意:百度云官网获取的 API Ke ...

  8. 百度AI人脸识别的学习总结

    本文主要分以下几个模块进行总结分析 项目要求:运用百度AI(人脸识别)通过本地与外网之间的信息交互(MQService),从而通过刷脸实现登陆.签字.会议签到等: 1.准备工作: 内网:单击事件按钮- ...

  9. Android Retrofit处理Token过期的问题

    Token有两种,access token和refresh token. 以下三条是token的作用和生命周期过程. 用户登录后,去访问其他接口,都需要在http head里带上access toke ...

最新文章

  1. php rabbmq教程_RabbitMQ+PHP 教程一(Hello World)
  2. Linux命令:less
  3. [Objective-c 基础 - 2.10] description方法
  4. JavaScript学习笔记——BOM_window对象
  5. go 多行字符串_Go语言基本功,了解Go语言基础语法
  6. Python培训的基础知识
  7. jenkins搭建_如何搭建移动端自动化测试平台?没错,就用Jenkins!
  8. 计算机教师职称申报工作总结,个人评定一级教师工作总结
  9. 关于0bug商用之道的第三章的少用模板
  10. 阿里影业“灯塔平台”今日正式启动,阿里影视云解决方案强势推出
  11. linux目录与文件,Linux目录与文件基本操作
  12. JSP中文乱码问题与解决方法
  13. u盘安装系统win2019服务器系统,U盘如何安装原版Windows server 2019?
  14. Python 文本解析器
  15. 第十届蓝桥杯(国赛)——大胖子走迷宫
  16. 一、ubuntu16.04下无法连接wifi(试遍所有方法及解决方案)
  17. oracle字体加粗函数_html把字体加粗
  18. oracle600错误,oracle ora-600 Ktspgsb-1 错误处理案例
  19. ppt怎么把图片做成翻书效果_ppt页面翻书效果怎么做?ppt翻书效果制作
  20. Android 线程池管理工具类

热门文章

  1. android7禁用selinux,Android7关闭selinux(设置为Permissive模式)
  2. ansible:permissive: access permissions must restrict access to only the owner
  3. hdu 1248寒冰王座
  4. JavaScript 最简单实现隐藏和显示元素
  5. JS 箭头函数与普通函数
  6. JavaScript箭头函数返回箭头函数
  7. 我的SPSS自学之旅
  8. 计算机审计学心得思考,审计学学习心得与体会.doc
  9. 新手站长如何选择优质的日本服务器
  10. tslib触摸屏测试程序源码