OKHTTP加拦截Interceptor 刷新token

2024-05-11 10:08

本文主要是介绍OKHTTP加拦截Interceptor 刷新token,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

原因为OkHttp请求回调中response.body().string()只能有效调用一次,而我使用了两次:


String result = response.body().string();
Log.e(TAG, "onResponse - " + response.body().string() );//打印时又使用了一次

如果添加拦截时,必须取response 中的值,那么在取出来知乎应该要重新创建

 //response.body().string() 只能调用一次   就会close  所以要重建responseresponse = response.newBuilder().body(ResponseBody.create(mediaType, responseBody)).build();

自定义 Intecepter

public class AuthenticatorInterceptor implements Interceptor {private String baseUrl;String url;public AuthenticatorInterceptor(String baseurl) {this.baseUrl = baseurl;url = baseUrl + Constants.AccountUrl.PREFIX + Constants.AccountUrl.PATH_USER_REFRESH;FLog.i("HttpLog", "AuthenticatorInterceptor url=" + url);}@Overridepublic Response intercept(Chain chain) throws IOException {FLog.i("HttpLog", "AuthenticatorInterceptor");// 获取请求Request request = chain.request();// 获取响应Response response = chain.proceed(request);// 在这里判断是不是是token失效// 当然,判断条件不会这么简单,会有更多的判断条件的FLog.i("HttpLog", "AuthenticatorInterceptor response.code()=" + response.code());if (response.code() == 400) {String responseBody = response.body().string();FLog.i("HttpLog", "AuthenticatorInterceptor responseBody=" + responseBody);MediaType mediaType;if (response.body() != null && response.body().contentType() != null) {mediaType = response.body().contentType();} else {mediaType = MediaType.parse("application/json;charset=utf-8");}FLog.i("HttpLog", "AuthenticatorInterceptor MediaType=" + mediaType.toString());FResult fResult = new Gson().fromJson(responseBody, FResult.class);//response.body().string() 只能调用一次   就会close  所以要重建responseresponse = response.newBuilder().body(ResponseBody.create(mediaType, responseBody)).build();if (fResult.getStatus().equals("4001")) {// 这里应该调用自己的刷新token的接口// 这里发起的请求是同步的,刷新完成token后再增加到header中// 这里抛出的错误会直接回调 onErrorString token = refreshToken();if (!TextUtils.isEmpty(token)) {// 创建新的请求,并增加headerRequest retryRequest = chain.request().newBuilder().header("Authorization", getToken()).build();// 再次发起请求return chain.proceed(retryRequest);}}}return response;}private String refreshToken() {String newtoken = null;/*** 必须使用同步请求*/MediaType JSON = MediaType.parse("application/json;charset=utf-8");Log.e("OkHttpManager", "重新请求---" + url);OkHttpClient client = new OkHttpClient();Map<String, String> map = new HashMap<>();map.put("accessToken", getToken());map.put("refreshToken", getRefreshToken());JSONObject jsonObject = new JSONObject(map);RequestBody requestBody = RequestBody.create(JSON, jsonObject.toString());Request request = new Request.Builder().url(url).post(requestBody).build();okhttp3.Call call = client.newCall(request);try {Response response = call.execute();//            FLog.i("HttpLog", "refreshToken response=" + response.body().string());//只能有效调用一次,不能打印CredentialDTO credentialDTO = new Gson().fromJson(response.body().string(), CredentialDTO.class);if (null != credentialDTO.accessToken && null != credentialDTO.refreshToken) {newtoken = credentialDTO.accessToken;TokenManager.getInstance().setAccessToken(credentialDTO.accessToken);TokenManager.getInstance().setRefreshToken(credentialDTO.refreshToken);FLog.i("HttpLog", "refreshToken accessToken==" + credentialDTO.accessToken);} else {newtoken = "";}} catch (IOException e) {e.printStackTrace();newtoken = "";}return newtoken;}private String getToken() {return TokenManager.getInstance().getAccessToken();}private String getRefreshToken() {return TokenManager.getInstance().getRefreshToken();}
}

调用

//刷新token
builder.addInterceptor(new AuthenticatorInterceptor(mBuilder.mBaseUrl));

这篇关于OKHTTP加拦截Interceptor 刷新token的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979226

相关文章

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

【NodeJS】Unexpected token (109:0) 返回错误码500

刚开始报错是这样的: Unexpected token call 是什么我没看懂,但我发现 span.label.lable-success 后面的 #[i+1] 写错了,应该是 #{i+1} 改成完这个错误后又是一个错误提示: What? Unexpected token (109:0) 返回错误码500是什么鬼 我先将自己这段源码的 - if ... - else 检查下

解决OAuth Token,点击退出登录报404问题

首先,认证服务器发送请求 http://auth.test.com:8085/logout?redirect_uri=http://admin.test.com:8080’ 退出后报404无法跳转到网站首页,这个时候增加一个参数redirect_uri指定退出成功后跳转的路径,因为是自定义的,所以需在认证服务器做一些处理 找到源码默认实现接口DefaultLogoutPageGeneratingF

OAuth2 Token实现授权码模式

文章目录 OAuth2 授权:Resource owner password(密码模式)OAuth2 授权:Authorization code grant授权码模式,适用于浏览器模式OAuth2:Implicit(简化授权模式)OAuth:Client credentials(客户端证书)授权码模式使用案例 OAuth2 授权:Resource owner password(密

记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON

knife4j页面报错问题定位 前几天开发新接口,开发完成后想使用knife4j测试一下接口功能,突然发现访问页面报错提示:knife4j文档请求异常,但之前运行还是正常的,想想会不会与升级依赖有关系,启动其他微服务发现文档接口访问正常,排除因依赖版本升级导致在线API文档无法使用情况,还是和本服务新增接口有关系。 定位问题 首先f12打开调试台,重新刷新页面,看到console有报错提示

Interceptor拦截器无法拦截根目录的解决方法

今天发现了一个bug,首页home.jsp的某一个值是通过拦截器拦截所有页面,然后赋值的,然而我们的首页是通过index.jsp直接引用首页home.jsp代码(如下),拦截器无法拦截。 <%@ include file="./WEB-INF/jsp/home.jsp" %> 首先,第一个解决方法就是,将首页的引用文件改为跳转即可 <html><head><meta http-equiv

okHttp框架的介绍 和关于https的自定义签名证书的问题

参考博客:【张鸿洋的博客】 Android Https相关完全解析 当OkHttp遇到Https 1.okhttp的介绍:  它能够处理: 一般的get请求一般的post请求基于Http的文件上传文件下载加载图片支持请求回调,直接返回对象、对象集合支持session的保持 开发平台使用:     使用前,对于Android Studio的用户,可以选择添加: compile '

【Http 每日一问,访问服务端的鉴权Token放在header还是cookie更合适?】

结论先行: token静态的,不变的,放在header里面。 典型场景 ,每次访问时需要带个静态token请求服务端,向服务端表明是谁请求,此时token也可以认为是个固定的access-key。token动态的,会失效,放在cookie里面。 典型场景,业务登录态token,存在有效期的,过一段时间可能会失效。 下面具体展开下。 在选择将鉴权 Token 放在 HTTP Header 还是

JWT生成、解析token

目录 1. 导入JWT相关依赖2. JWT生成token3. JWT解析token4. 测试结果5. JWT加密、解密工具类 1. 导入JWT相关依赖 <!-- jwt认证模块--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.10.2</

python eval报错 SyntaxError: invalid token

a = eval(startTime)   File "<string>", line 1     2019-01-02 11:00:00               ^ SyntaxError: invalid token startTime = '2019-01-02 11:00:00'a = eval(startTime) 具体内容如上: 后来发现,在eval中的