参考自:https://blog.csdn.net/huweijian5/article/details/88903561
/**
* @author zyl
* @date 2020/7/24 3:54 PM
*/
internal class TokenInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request().newBuilder()
// 添加默认的Token请求头
request.addHeader("Authorization", TokenMmkv.accessToken.toString())
val response = chain.proceed(request.build())
if (request.build().url.toString().contains("tokenRefresh")) {
// 直接返回response,忽略拦截器,否则会无限拦截
return response
}
val mediaType = response.body?.contentType()
val content = response.body?.string()
if (isTokenExpired(content ?: "")) {
val newToken = getNewToken()
when (newToken?.code) {
0 -> {
LogUtils.d("获取新的token和refreshToken")
TokenMmkv.accessToken = newToken.data.token
TokenMmkv.refreshToken = newToken.data.refreshToken
}
300 -> {
LogUtils.d("RefreshToken过期了,跳到登录界面")
MMKV.defaultMMKV().remove("PersonId")
MMKV.defaultMMKV().remove("EnterpriseId")
MMKV.defaultMMKV().remove("isApprove")
// 移除之前保存的token值
TokenMmkv.removeToken()
// refreshToken 过期,跳到登录界面
ARouter.getInstance().build("/person/main/activity").navigation()
// 这边必须制造一个假的返回值,否值会有问题,假如直接返回response,则会报错
val baseBean = BaseBean(RefreshToken("", ""), 300, "登录过期,请重新登录!")
return response.newBuilder().body(ResponseBody.create("application/json".toMediaType(), GsonUtils.toJson(baseBean))).build()
}
}
// 如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感
// 使用新的Token,创建新的请求
val newRequest = chain.request()
.newBuilder()
.addHeader("Authorization", TokenMmkv.accessToken.toString())
.build()
return chain.proceed(newRequest)
}
return response
.newBuilder()
.body(ResponseBody.create(mediaType, content ?: ""))
.build()
}
// 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求,这边需要过滤掉Token拦截,防止无限循环的被拦截
private fun getNewToken(): BaseBean<RefreshToken>? {
// 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求
// 要用retrofit的同步方式
val call = Api.apiInstance.refreshToken(RequestTokenBody(TokenMmkv.refreshToken))
var newToken: BaseBean<RefreshToken>? = null
return try {
newToken = call.execute().body()
newToken
} catch (e: IOException) {
e.printStackTrace()
null
}
}
/**
* 根据Response,判断Token
* @return
*/
private fun isTokenExpired(resultStr: String): Boolean {
val (_, code) = GsonUtils.fromJson(resultStr, BaseBean::class.java)
if (code == 300) {
LogUtils.d("Token过期了,用RefreshToken获取新token")
return true
}
return false
}
}
本文地址:https://blog.csdn.net/llayjun/article/details/107628265
如对本文有疑问, 点击进行留言回复!!
JWT RS256加解密、JWK获取PublicKey和PrivateKey、从已存在公私钥加解密JWT
pytorch安装实录(win10+cuda8+pycharm+anaconda)
小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
网友评论