Android token過期刷新處理

第一種方案

通過okhttp提供的Authenticator接口,但是只有HTTP返回碼為401時(shí)才會(huì)觸發(fā)。此種方式局限性很大,要求后臺(tái)設(shè)計(jì)必須符合規(guī)范。在實(shí)際項(xiàng)目中不可能完美實(shí)現(xiàn)。此種方式不做詳解,百度很多。

第二種方案

根據(jù)和后端協(xié)商好的返回碼處理刷新token步驟。代碼如下;

public class TokenInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder request = chain.request().newBuilder();
        //添加默認(rèn)的Token請(qǐng)求頭
        request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId());

        Response proceed = chain.proceed(request.build());
        okhttp3.MediaType mediaType = proceed.body().contentType();

        //如果token過期 再去重新請(qǐng)求token 然后設(shè)置token的請(qǐng)求頭 重新發(fā)起請(qǐng)求 用戶無感
        String content = proceed.body().string();
        if (isTokenExpired(content)) {

            String newToken = getNewToken();

            UserInfo.getInstance().setPhpSessionId(newToken);
            //使用新的Token,創(chuàng)建新的請(qǐng)求
            Request newRequest = chain.request().newBuilder()
                    .addHeader("Cookie", newToken)
                    .build();
            return chain.proceed(newRequest);
        }
        return proceed.newBuilder()
                .body(okhttp3.ResponseBody.create(mediaType, content))
                .build();

    }

    private String getNewToken() {
        // 通過一個(gè)特定的接口獲取新的token,此處要用到同步的retrofit請(qǐng)求
        IndexService service = IndexService.Builder.getServer();
        Call<BaseObjResult<UserBean>> call = service.getToke(
                UserInfo.getInstance().getPhone(),
                UserInfo.getInstance().getPwd(),
                0);

        //要用retrofit的同步方式
        BaseObjResult<UserBean> newToken = null;
        try {
            newToken = call.execute().body();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return newToken.getResult().getPHPSESSID();
    }

    /**
     * 根據(jù)Response,判斷Token是否失效
     *
     * @return
     */
    private boolean isTokenExpired(String resultStr) {
        RequestCode requestCode = new Gson().fromJson(resultStr, RequestCode.class);
        //err==3  token過期
        if (requestCode.getErr() == 3) {
            LogUtils.e("Token登錄過期了");
            ToastUtils.showShortSafe("Token登錄過期了");
            return true;
        }

        return false;
    }

    class RequestCode {
        private int err;
        private String msg;

        public int getErr() {
            return err;
        }

        public void setErr(int err) {
            this.err = err;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

}

使用方式

  okBuilder.addInterceptor(new TokenInterceptor()); //請(qǐng)求過期更換token
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,120評(píng)論 2 59
  • 以這篇文章為開頭,以后每個(gè)星期都會(huì)寫對(duì)《通往財(cái)富自由之路》的讀書筆記,主要形式是拆書幫的“便簽學(xué)習(xí)法”。 R-復(fù)...
    會(huì)飛的魚_flyfish閱讀 310評(píng)論 2 0
  • 我最初接受的謊言,是有關(guān)我的身世的。 小的時(shí)候,我一直都很懷疑自己的身世,我不知道自己是從哪里來,像許多小孩一樣,...
    楊志生閱讀 369評(píng)論 3 2
  • 數(shù)組: 數(shù)組是一系列相同類型的有序數(shù)據(jù)的集合,數(shù)組中的每一個(gè)元素都是同一個(gè)數(shù)據(jù)類型,所有元素共用一個(gè)名字,用下標(biāo)來...
    真一閱讀 1,171評(píng)論 8 0

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