针对OAuth2.0授权操作的,token一般半小时有效期。token失效后,我们需要自动刷新token功能,于是拦截器就派上用场了。
直接上代码
1、封装网络请求 ,按自己需求封装
public static void networkJwtInfo(String url,String type,OkDelegate delegate){
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new SonyInterceptor())
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.build();
Request.Builder builder;
if (type.equals(GET)) {
builder = new Request.Builder().get();
}else {
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), "");
builder = new Request.Builder().post(requestBody);
}
final Request request = builder
.url(url)
.addHeader("Authorization", "Bearer " + SonyConfig.tokenInfo().access_token)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("TAG", "onResponse: "+e.getLocalizedMessage() );
SLCApplication.runOnMainThread(new Runnable() {
@Override
public void run() {
delegate.okFail(e.getLocalizedMessage());
}
});
}
@Override
public void onResponse(Call call, Response response) {
// Log.e("TAG", "onResponse: "+response );
SLCApplication.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
String str = response.body().string();
delegate.okSuccess(str);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}
拦截器类 SonyInterceptor
/**
* SonyInterceptor
* Create by lxy on 4/7/22 10:30 AM
* Copyright © 2021 lxy. All rights reserved.
**/
public class SonyInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request vRequest = chain.request();
Response response = chain.proceed(vRequest);
ResponseBody responseBody = response.body();
// Log.e("TAG", "intercept: "+response.toString() );
String resultJson = responseBody.string();
Log.e("TAG", "intercept: "+resultJson );
if (resultJson.contains("4002")){
if (refreshToken()){
return chain.proceed(vRequest.newBuilder()
.removeHeader("Authorization")
.addHeader("Authorization", "Bearer " + SonyConfig.tokenInfo().access_token)
.build());
}else {
return response;
}
}
return response;
}
/**
* 刷新令牌
*/
public static boolean refreshToken(){
try {
OkHttpClient okHttpClient = new OkHttpClient
.Builder()
.connectTimeout(4, TimeUnit.SECONDS)
.readTimeout(3, TimeUnit.SECONDS)
.writeTimeout(3, TimeUnit.SECONDS)
.build();
String url = SonyAPI.SONY_OAUTH_URL+"/token";
String json = "client_id="+SonyAPI.CLIENT_ID+"&client_secret="+SonyAPI.CLIENT_SECRET+"&grant_type=refresh_token&"+"refresh_token="+SonyConfig.tokenInfo().refresh_token;
RequestBody requestBody = FormBody.create(MediaType.parse("application/x-www-form-urlencoded"), json);
Request request = new Request.Builder().url(url).post(requestBody)
// .addHeader("Authorization", "Basic "+"MGI5ZDA5ZmYzM2NhNGUwZWI0Yjc3NTRmNDUxYzY4Nzg6OGZjMmFiNmJmNDY4NGNkZGE1NWIwOWNkOTk5MTNlNzk=")
.build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
if(response.isSuccessful()){ //刷新成功
String resultJson = response.body().string();
Type type = new TypeToken<SonyToken>(){}.getType();
SonyToken aa = new Gson().fromJson(resultJson, type);
SonyConfig.saveSonyToken(aa);
return true;
}
} catch (Exception e) {
//e.printStackTrace();
Log.e("http", "刷新令牌失败", e);
}
return false;
}
}
尊重原创,转载请说明出处!