This topic created in 1104 days ago, the information mentioned may be changed or developed.
java 大佬们:
如题所示,最近搞的小项目需要调用第三方接口,接口需要传递公共参数 token ( token 有过期时间)目前的做法是在项目启动的时候正常请求拿到 token ,放到本地缓存里。
目前逻辑是,如果调用第三方接口的时候返回 token 过期了就重新调用获取 token 接口并返回前端提示失败(提示用户稍后重试)。
是感觉这样写很麻烦,因为调用的地方和接口数量太多了。怎么才能做到统一处理或者拦截?做到类似于前端 token 无感刷新
Supplement 1 May 5, 2023 补充一下:没有 Expiretime 间和可以用来刷新 AccessToken 的 RefershToken 。
22 replies 2023-05-16 10:41:21 +08:00  | | 1 hhjswf May 5, 2023 第三方有没提供刷新 token 的接口? |
 | | 4 LeegoYih May 5, 2023 获取了新 token ,旧 token 还能不能用? 如果可以就启动一个定时任务,比超时时间提前几分钟获取新 token ,这样过程中也不会影响其他人使用。 如果不可以,那就没有其他更好的方案,都差不多 |
 | | 7 binge921 May 5, 2023 拦截器 或者 过滤器 拿到 token 比对过期时间 如果失效就重新获取 或者要求第三方 api 提供刷新 token 接口 或者根据第三方 api 的 token 过期时间 进行时间段内的定时任务批量刷新 才疏学浅 我能想到的就这些了 |
 | | 8 rizon May 5, 2023 1. 一般都会提供 refresh 接口,独立的定时任务刷新一下就好。 2. 在 cacheManager 中,当 get 缓存时,检查缓存的过期时间马上到了,就在返回旧 token 的同时,异步刷新新的 token 。 3. 如果缓存连过期时间都没有,在调用业务接口地方,当 catch 到 token 失效的返回值之后,自动完成一次 retry 操作。
如果要优雅可以借助相关的注解:cache 和 retry 都有注解可以使用。保证代码美美的 |
 | | 10 james2013 May 5, 2023 第 1 种方法:每个调用第三方接口均调用同 1 个获取 token 方法 a,a 方法使用锁,在 a 方法进行逻辑判断:token 不存在或者过期,则调用第 3 方刷新 token 接口,记录 token 过期时间 第 2 种方法:如果是 retrofit 或者 okhttp 网络框架请求第三方,本身有拦截器,在拦截器中判断接口前缀是第 3 方并且不是刷新 token 的接口则进行统一的逻辑判断 |
 | | 11 luomao May 5, 2023 1. 封装调用第三方的接口 2. 在封装中响应处理时根据第三方系统的错误信息判断是否可以处理,譬如过期 3. 将 token 存储到 redis 或者服务内存中,微服务架构建议存 redis 中 4. 如果发生 token 失效,就重新获取 token 并存储,且重新调用接口 (记得设置重试上限) |
 | | 12 Habyss May 5, 2023 1. token 放在有过期时间的缓存中 2. 所有需要 token 的地方, 统一调用一个方法获取 token 3. 在获取 token 的方法内 先去缓存拿 token, 如果没有, 则获取新的 token, 并重新设置缓存(拥有过期时间), 返回新的 token.(加不加锁看自己项目情况) 4. 这不就是相当于无感调用, 而且没有[返回前端提示失败], 除非获取 token 的第三方接口出错 |
 | | 13 pepesii May 5, 2023 不会 java , 但是问题很普遍啊,token 给你的时候,是有 expiretime 的吧,你把这个记着(缓存?),在每次使用前判断下过期了没有,然后过期了重新拿,没过期就直接用,这样... |
 | | 15 itechify May 5, 2023 via Android 和第三方沟通,为啥要调用返回才知道 token 过期了,不能给个过期时间,好让对接方定时任务提前刷好? |
 | | 16 009694 May 5, 2023 via iPhone 我启了单独的协程单独维护 token |
 | | 17 BugCry May 6, 2023 我写了个定时任务,把 token 刷新到 consul 中,下游会自动监听变化 |
 | | 18 zhongpingjing May 6, 2023 用 guava 的缓存实现就好了,可以配置定时刷新,只要把刷新的间隔小于有效时间就可以一直有效 |
 | | 19 codeMore May 6, 2023 我们是写了个 token 中控服, 1 、所有需要调用三方获取 token 的都调该中控服,由中控服去获取最新的 token ,并缓存再中控服内, 2 、如果某个业务使用处发现这个 token 过期了,那么就携带该过期 token 去请求中控服,中控服判断如果传入的 token 和缓存的 token 一致,那么就再去渠道刷一个最新的 token 缓存并返回。 3 、中控服缓存的过期时间比渠道返回的过期时间小 1-2 分钟,这样可以做到提前刷新,用户侧就不会感知到 token 过期的情况 |
 | | 21 ThreeK May 16, 2023 自己写个 getToken 方法不就行了,返回前判断下刷新时间,到了刷新时间就去刷新再取一次,没有到就直接返回缓存里的。要是像我之前对接京东 e 卡,新老 token 在过期前都能用,这个方法并发都不需要考虑。 |
 | | 22 ThreeK May 16, 2023 我日,没有过期时间、刷新时间啊,那就没法了。只能自己根据经验设置个时间看多久去触发一次刷新 token ,尽量少出现 token 过期,再就是统一异常拦截 token 过期的异常兜个底。 |