Android token过期刷新处理

第一种方案

通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。

第二种方案

根据和后端协商好的返回码处理刷新token步骤。代码如下;

public class TokenInterceptor implements Interceptor {

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

        Request.Builder request = chain.request().newBuilder();
        //添加默认的Token请求头
        request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId());

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

        //如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感
        String content = proceed.body().string();
        if (isTokenExpired(content)) {

            String newToken = getNewToken();

            UserInfo.getInstance().setPhpSessionId(newToken);
            //使用新的Token,创建新的请求
            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() {
        // 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求
        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();
    }

    /**
     * 根据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()); //请求过期更换token
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,772评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,540评论 2 59
  • 以这篇文章为开头,以后每个星期都会写对《通往财富自由之路》的读书笔记,主要形式是拆书帮的“便签学习法”。 R-复...
    会飞的鱼_flyfish阅读 1,873评论 2 0
  • 我最初接受的谎言,是有关我的身世的。 小的时候,我一直都很怀疑自己的身世,我不知道自己是从哪里来,像许多小孩一样,...
    杨志生阅读 2,707评论 3 2
  • 数组: 数组是一系列相同类型的有序数据的集合,数组中的每一个元素都是同一个数据类型,所有元素共用一个名字,用下标来...
    真一阅读 4,744评论 8 0

友情链接更多精彩内容