android-discuss icon indicating copy to clipboard operation
android-discuss copied to clipboard

[问答]开发中一般怎么处理 token 期逻辑,过期后需求要求必须重新跳到登录页面

Open qiujiecn opened this issue 8 years ago • 5 comments

qiujiecn avatar Dec 19 '17 03:12 qiujiecn

retrofit统一处理的,约定相同的状态码。

dndxxiangyu avatar Dec 19 '17 04:12 dndxxiangyu

有具体一点的说明吗 @dndxxiangyu

Eklett avatar Jan 24 '18 12:01 Eklett

token过期时,服务端返回一个固定的code ,比如1008 ,客户端解释数据时判断code值,如果code=1008,那么说明token过期了,就要跳转到登录页面 。下面代码可以参考下

public abstract class RetrofitCallback<T extends BaseBean> implements Callback<T> {
    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (response != null && response.isSuccessful()){
//            Logger.d("result : " + response.body().toString());
            int code = response.raw().code();
            if (code == 200){
                int status = response.body().getStatus();
                if (status == 1){//请求成功
                    T t = response.body();
                    onSuccess(t);
                }else{
                    int errorCode = response.body().getError().getCode();
                    switch (errorCode){
                        case Constant.TOKEN_OVERDUE_CODE://token过期

                        case Constant.REQUIRED_TOKEN_CODE:
                            onAutoLogin();
                            break;
                        default:
                            onFail(Constant.UNKNOWN_ERROR_CODE,response.body().getError().getMsg());
                            break;
                    }
                }
            }else{
                onFail(Constant.UNKNOWN_ERROR_CODE,response.body().getError().getMsg());
            }
        }else {
            onFail(Constant.UNKNOWN_ERROR_CODE,response.body().getError().getMsg());
        }
    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        Logger.d( "t : " + t.getMessage());
        if (call.isCanceled() || t instanceof SocketException) {
            onFail(Constant.UNKNOWN_ERROR_CODE,"isCanceled");
        }else if (t instanceof SocketTimeoutException){
            onFail(Constant.SOCKETTIMEOUT_ERROR_CODE,"请求超时");
        }else if(t instanceof NetworkErrorException){
            onNetworkError();
        }else if(t instanceof RuntimeException){
            onFail(Constant.UNKNOWN_ERROR_CODE,t.getMessage());
        }else if (t instanceof UnknownHostException){
            onNetworkError();
        }else{
            onFail(Constant.UNKNOWN_ERROR_CODE,t.getMessage());
        }
    }

    public abstract void onSuccess(T t);

    public abstract void onFail(int code ,String message);

    public void onNetworkError(){

    }
    public void onAutoLogin(){

    }
}

yanxinmiao avatar Jan 25 '18 07:01 yanxinmiao

后台每个接口check token的是否有效,无效就返回统一编码,你每次请求的时候就判断错误码就行了

T-Tenma avatar Jan 29 '18 08:01 T-Tenma

我的做法是获取新token对用户来说是无感的,通过Http状态码403来控制,使用Okhttp拦截器来判断是否过期,如果过期重新获取新token。

Xiaocai9527 avatar Dec 20 '18 01:12 Xiaocai9527