Android okhttp 刷新token

Token失效,請求接口失敗,需要重新獲取新Token,重新訪問接口。
通過Okhttp訪問網(wǎng)絡(luò),添加攔截器來解決此問題
創(chuàng)建一個攔截器TokenInterceptor

public class TokenInterceptor implements Interceptor {

    private static final String TAG = "TokenInterceptor";
    private String url = "xxx";

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        Log.d(TAG, "response.code=" + response.code());

        //判斷token是否過期,與后臺小伙伴協(xié)商,或者通過判斷新舊token是否一致
        if (isTokenExpired(response)) {
            Log.d(TAG, "自動刷新Token,然后重新請求數(shù)據(jù)");
            //同步請求方式,獲取最新的Token
            String newToken = getNewToken();
            Log.e(TAG, "intercept:新的請求頭 "+newToken );
            //使用新的Token,創(chuàng)建新的請求
            Request newRequest = chain.request()
                    .newBuilder()
                    .header("Authorization", newToken)
                    .build();
            //重新請求
            return chain.proceed(newRequest);
        }
        return response;
    }

    //判斷Token是否過期,我這里是因為Token過期會返回403,可以通過判斷新舊token是否一致
    private boolean isTokenExpired(Response response) {
        if (response.code() == 403) {
            return true;
        }
        return false;
    }

    //用同步方法獲取新的Token
    private String getNewToken() throws IOException {
        // 通過獲取token的接口,同步請求接口
        String newToken = "";
        Map<String, String> map = new ConcurrentHashMap<>();
        map.put("xxx", xxx);
        map.put("xxx", xxx);
        // GsonUtil只是有個把Map變成String的工具類
        String params = GsonUtil.mapToJson(map);
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), params);
        OkHttpClient client = new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();
        Request request = new Request.Builder().url(MyDatas.path + url)
                .post(requestBody).build();
        Call call = client.newCall(request);
        try {
            Response response = call.execute();
            //坑人點,response.body().string()只能調(diào)用一次,否則會報java.lang.IllegalStateException: closed
            //第一次調(diào)用.body().string(),OkHttp就會默默地釋放資源,再次調(diào)用就會拋出異常,有興趣的可以去看源碼
            String relut = response.body().string();
            Log.e(TAG, "getNewToken: " +relut);
            JSONObject jsonObject = new JSONObject(relut);
            Integer code = jsonObject.getInt("code");
            if (code != 10000) {
                Object Data = jsonObject.get("data");
            } else {
                Gson gson = new Gson();
                TokenBean bean = gson.fromJson(relut, TokenBean.class);
                 newToken = bean.getData().getAuthorization();
                MyDatas.token = bean.getData().getAuthorization();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newToken;
    }
}
okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(60 , TimeUnit.SECONDS)
                .readTimeout(60 , TimeUnit.SECONDS)
                .writeTimeout(60 , TimeUnit.SECONDS)
                .addInterceptor(new TokenInterceptor())
                .build();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 五一小長假前,期中考試日。 今天一天,七年級考了語文、歷史,地理、生物。 四科中有三科試卷都有問題,反映了又沒得到...
    懂心理的語文老師閱讀 334評論 0 1
  • 冬至日?一年中晝最短夜冬至日?一年中晝最短夜最長!我的家鄉(xiāng)過冬至不吃餃子,不吃湯圓~而是吃一種我們方言叫做“tui...
    素衣浪子閱讀 301評論 0 2
  • 一 地鐵里,拿著手機(jī)的姑娘挨個央求著乘客幫她掃描這個二維碼;另一頭,緩緩爬過來一個音響里放著佛教音樂的殘疾人乞丐。...
    我叫王村村閱讀 2,057評論 6 61
  • 沖著奧斯卡的名聲和馬赫沙拉·阿里性感的小胡子,捏著電影票,打開了他們的世界。 開篇白人托尼為了生計吃下26個熱狗,...
    時間簡史一號店閱讀 297評論 1 0
  • 2018年4月22日 星期日 雷陣雨 早睡早起瞌睡少,果然不假! 這兩天早更嚴(yán)重,身體累得像二萬五千里長征后的...
    木徒閱讀 444評論 0 0

友情鏈接更多精彩內(nèi)容