自动检查token的有效性并刷新无效token的需求在项目中很常见,下面是在项目中用到的Okttp3 Token拦截器,实现了
- 在GET请求下,自动检查token的有效性,并对原有的token参数进行替换更新
- 在POST请求下,自动检查token的有效性,取出FormBody中原有的请求参数,替换原有的token参数
public class OkTokenInterceptor implements Interceptor
{
private static final String LOG = OkTokenInterceptor.class.getSimpleName();
private static final Charset UTF_8 = Charset.forName("UTF-8");
@Override
public Response intercept(Chain chain) throws IOException
{
Request originalRequest = chain.request();
HttpUrl originalHttpUrl = originalRequest.url();
String originalUrl = originalHttpUrl.url().toString();
String method = originalRequest.method();
Logger.i(LOG, "originalUrl-->" + originalUrl);
Logger.i(LOG, "method-->" + originalRequest.method());
final Response originalResponse = chain.proceed(originalRequest);
// 获取返回的数据字符串
ResponseBody responseBody = originalResponse.body();
BufferedSource source = originalResponse.body().source();
source.request(Integer.MAX_VALUE);
Buffer buffer = source.buffer();
Charset charset = UTF_8;
MediaType contentType = responseBody.contentType();
if (contentType != null)
{
charset = contentType.charset();
charset = charset == null ? UTF_8 : charset;
}
String bodyString = buffer.clone().readString(charset);
Logger.i(LOG, "拦截前:" + bodyString);
final String token = DatabaseUtils.getInstance().getToken();
Logger.i(LOG, "当前的token:" + token);
//排除登录的API
if (!originalUrl.equals(EcConstant.LOGIN_API))
{
if (!TextUtils.isEmpty(token))
{
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(EcConstant.BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.client(new OkHttpClient())
.build();
TokenApi api = retrofit.create(TokenApi.class);
Call<String> checkTokencall = api.get(EcConstant.CHECK_TOKEN_API + "token/" + token + "/");
String checkTokenResponse = checkTokencall.execute().body(); // 同步
Logger.i(LOG, "checkTokencall-->" + checkTokenResponse)