OKHttp攔截器做登錄令牌失效基本處理

主要是討論兩個方面的問題俩块,一是攔截器的作用和寫法吏奸;二是為什么登錄失效要監(jiān)聽HTTP的請求欢揖,如有不足,萬望指出奋蔚。

OKHttp的攔截器

  • 可以監(jiān)聽請求和響應(yīng)應(yīng)答她混,chain.proceed(request)是每個攔截器實現(xiàn)的關(guān)鍵部分烈钞。這個看似簡單的方法是所有HTTP 工作發(fā)生的地方, 在這里產(chǎn)生一個響應(yīng)應(yīng)答請求.
    我們先過一下攔截器的基本寫法:
OKHttpClient client =  new OKHttpClient();
client.interceptors().add(new MyInterceptor());

實現(xiàn)okhttp的interceptor, chain可以獲取http所以請求發(fā)生的地方坤按。

public class CityBaseInterceptor implements Interceptor{
  private static final Charset UTF8 = Charset.forName("UTF-8");
     @Override
        public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        long t1 = System.nanoTime();
        logger.info(String.format("sending request : %s on %s%n%s",   
                 request.url(),chain.connection(),request.headers()));
        RequestBody requestBody = request.body();
        Charset charset1 = UTF8;
        MediaType contentType1 = requestBody.contentType();
        if (contentType1 != null) {
            charset1 = contentType1.charset(UTF8);
        }
        String questString = requestBody.toString();
        /************/
        Log.v("yjq", String.format("sending request : %s on %s%n%s%n%s",
        request.url(),chain.connection(),request.headers(),questString));
        Response response = chain.proceed(request);
        long t2 = System.nanoTime();
        logger.info(String.format("receive request for %s in %.1fms%n%s",
                response.request().url(),(t2 - t1)/1e6d,response.headers()));

        ResponseBody responseBody = response.body();

        BufferedSource source = responseBody.source();

        source.request(Long.MAX_VALUE); // Buffer the entire body.
        Buffer buffer = source.buffer();
        Charset charset = UTF8;
        MediaType contentType = responseBody.contentType();
        if (contentType != null) {
            charset = contentType.charset(UTF8);
        }
        String bodyString = buffer.clone().readString(charset);
        Log.v("yjq","body---------->" + bodyString);
        //TODO 這里可以處理自己的業(yè)務(wù)請求毯欣,包括重新請求新的Token,獲取驗證信息等等臭脓。
        //showDialog();
        Log.v("yjq", String.format("receive request for %s in %.1fms%n%s",
                response.request().url(),(t2 - t1)/1e6d,response.headers()));
        return response;
    }
}

其他的應(yīng)用場景為:

  1. 重寫請求
    通過攔截器可以添加酗钞,移除,替換請求頭来累。也可以改變請求的請求體砚作。例如,在知道連接的web服務(wù)器是否支持壓縮格式的情況下嘹锁,可以使用應(yīng)用攔截器添加請求體壓縮類型葫录。
  2. 重寫響應(yīng)
    相對應(yīng)地,攔截器可以重寫響應(yīng)頭和改變響應(yīng)體领猾。這一點比重寫寫請求頭要危險米同,因為可能違反web服務(wù)器的期望。
    如果你處于一種比較糾結(jié)的狀態(tài)摔竿,并且準備處理結(jié)果窍霞,那么重寫響應(yīng)頭是解決問題的有效方法。例如拯坟,可以修復(fù)服務(wù)器配置錯誤的Cache-Control響應(yīng)頭是緩存更高效但金。

登錄失效的處理

APP的用戶登錄如果失效,或者在其他設(shè)備上登錄郁季,我們一般通過服務(wù)器推送失效通知給設(shè)備冷溃,提醒用戶保障賬戶安全,重新登錄梦裂。
如果我們需要在請求過程中通過服務(wù)器反饋的協(xié)商好的字段來判定用戶登錄信息是否失效似枕,則可以通過攔截器,并用全局的dialog提示年柠。

  • 實現(xiàn)全局的dialog有幾種方式凿歼,一是通過WindowManager定義寬高,并inflate自定義的view冗恨。
 final WindowManager wm = (WindowManager) MyApplication.getContext().getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams para = new WindowManager.LayoutParams();
        para.height = -1;
        para.width = -1;
        para.format = 1;

        para.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

        para.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        final View mView = LayoutInflater.from(MyApplication.getContext()).inflate(
                R.layout.test3, null);
        wm.addView(mView, para);

二是通過一個后臺Service啟動一個dialog答憔,這個dialog需要添加一個窗口句柄:

mWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

例子:

public class NewAlertDialog extends Dialog{
    private Window mWindow;
    private CloseSystemDialogsReceiver mCloseSystemDialogsReceiver;

    protected NewAlertDialog(Context context) {
        super(context);
    }

    protected NewAlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    protected NewAlertDialog(Context context, int themeResId) {
        super(context, themeResId);
        setContentView(R.layout.token_invalid);
        mWindow = this.getWindow();
        if(mWindow != null) {
            WindowManager.LayoutParams attributes = mWindow.getAttributes();
//        attributes.width = mWindow.getWindowManager().getDefaultDisplay()
//                .getWidth();
            attributes.width = WindowManager.LayoutParams.WRAP_CONTENT;
            attributes.height = WindowManager.LayoutParams.WRAP_CONTENT;
            mWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

            IntentFilter filter = new IntentFilter(
                    Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            mCloseSystemDialogsReceiver = new CloseSystemDialogsReceiver();
            mWindow.getContext().registerReceiver(mCloseSystemDialogsReceiver,
                    filter);
        }
    }

    private class CloseSystemDialogsReceiver extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {
                    NewAlertDialog.this.dismiss();          
            
   mWindow.getContext().unregisterReceiver(mCloseSystemDialogsReceiver);
getContext().stopService(new Intent(getContext(),WindowDialogService.class));
                }
            }
        }
    }
}

其中CloseSystemDialogsReceiver是處理SYSTEM.ALERT的dialog點擊Home鍵無法消失的問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掀抹,一起剝皮案震驚了整個濱河市虐拓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傲武,老刑警劉巖蓉驹,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城榛,死亡現(xiàn)場離奇詭異,居然都是意外死亡态兴,警方通過查閱死者的電腦和手機狠持,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞻润,“玉大人工坊,你說我怎么就攤上這事「叶” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵罢吃,是天一觀的道長楚午。 經(jīng)常有香客問我,道長尿招,這世上最難降的妖魔是什么矾柜? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮就谜,結(jié)果婚禮上怪蔑,老公的妹妹穿的比我還像新娘。我一直安慰自己丧荐,他們只是感情好缆瓣,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虹统,像睡著了一般弓坞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上车荔,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天渡冻,我揣著相機與錄音,去河邊找鬼忧便。 笑死族吻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的珠增。 我是一名探鬼主播超歌,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒂教!你這毒婦竟也來了握础?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤悴品,失蹤者是張志新(化名)和其女友劉穎禀综,沒想到半個月后简烘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡定枷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年孤澎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欠窒。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡覆旭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岖妄,到底是詐尸還是另有隱情型将,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布荐虐,位于F島的核電站七兜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏福扬。R本人自食惡果不足惜腕铸,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铛碑。 院中可真熱鬧狠裹,春花似錦、人聲如沸汽烦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撇吞。三九已至碗暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梢夯,已是汗流浹背言疗。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颂砸,地道東北人噪奄。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像人乓,于是被迫代替她去往敵國和親勤篮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容