retrofit2拦截器处理401

在使用retrofit 请求的时候如果遇到了401怎么办?在每个请求之后都处理?那么这个就比较麻烦。我们可以在获取retrofit之前加入Interceptor,在1.9之前你可以使用RequestInterceptor来拦截一个请求,但在2.0这个被取消,现在我们必须转而使用okHttp的Interceptor。

public WebService getmWebService() {
        if (mWebService == null) {
            initOkHttpInterceptor();//okhttp的拦截器
            retrofit = new Retrofit.Builder()
                    .baseUrl(UrlConstant.BASE_URL)
                    .client(client)L
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            mWebService = retrofit.create(WebService.class);
        }
        return mWebService;

    }
private void initOkHttpInterceptor() {
        Interceptor mTokenInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                if ( token == null) {//表示第一次登陆还没拉取过token
                    return chain.proceed(originalRequest);//执行登陆的操作
                }
              //此处表示已有token 这时只需要判断401即可
                Request authorised = originalRequest.newBuilder()
                        .header("Authorization",  token)//此处的token 是你保存在本地的
                        .build();
                Response response = chain.proceed(authorised);//执行此次请求
                if (response.code() == 401) {//返回为token失效
                    refreshToken();//重新获取token,此处的刷新token需要同步执行以防止异步到来的问题
                    Request newRequest = originalRequest.newBuilder()
                            .header("Authorization", token)
                            .build();//
                    return chain.proceed(newRequest);
                }
                return response;
            }
        };
        client = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)
                .connectTimeout(15, TimeUnit.SECONDS)
                .addInterceptor(mTokenInterceptor)
                .build();
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值