1. 程式人生 > >Retrofit Token過期 重新請求Token再去請求介面

Retrofit Token過期 重新請求Token再去請求介面

需求是這樣的:請求介面A -- 伺服器返回資料Token過期或失效  -- 重新請求Token並設定 -- 再去請求介面A

剛解決了這個問題,趁熱打鐵,寫個部落格記錄一下;這個Token是新增到請求頭裡面的;

使用OKHTTP設定Retrofit中的請求頭:

*記錄請求到的Token

/**
 * 請求頭token
 * @return
*/
public String headerToken = "";
*如果Token過期或失效,則去重新請求獲取token的介面,然後設定請求頭,再去重新請求這個介面。
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.connectTimeout(30, TimeUnit.SECONDS); client.readTimeout(30, TimeUnit.SECONDS); client.writeTimeout(30, TimeUnit.SECONDS); client.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request.Builder request = chain.request().newBuilder();
request.addHeader("Authorization", headerToken); //新增預設的Token請求頭 Response proceed = chain.proceed(request.build()); //如果token過期 再去重新請求token 然後設定token的請求頭 重新發起請求 使用者無感 if (isTokenExpired(proceed)){ String newHeaderToken = getNewToken(); //使用新的Token,建立新的請求 Request newRequest = chain.request().newBuilder() .addHeader("Authorization"
, newHeaderToken) .build(); return chain.proceed(newRequest); } return proceed; } });

*判斷Token過期的方法

/**
 * 根據Response,判斷Token是否失效
* 401表示token過期
* @param response
* @return
*/
private boolean isTokenExpired(Response response) {
    if (response.code() == 401) {
        return true;
}
    return false;
}

*重新請求Token的方法,注意這個方法不能使用非同步,要使用同步請求;

/**
 * 同步請求方式,獲取最新的Token
 *
 * @return
*/
private String getNewToken() throws IOException {
    Retrofit retrofit= new Retrofit.Builder()
            .baseUrl("https://xxxxx")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
retrofit2.Response<JsonObject> tokenJson = retrofit.create(CommonApi.class).ccbTestGetToken().execute();
headerToken = tokenJson.body().get("Token").toString();
    return headerToken;
}
參考部落格 一葉扁舟:https://blog.csdn.net/jdsjlzx/article/details/52442113