Android开发经验谈Android技术知识Android开发

Android token过期刷新处理

2018-10-23  本文已影响78人  时间在走

第一种方案

通过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
上一篇下一篇

猜你喜欢

热点阅读