android-discuss
android-discuss copied to clipboard
[问答]开发中一般怎么处理 token 期逻辑,过期后需求要求必须重新跳到登录页面
retrofit统一处理的,约定相同的状态码。
有具体一点的说明吗 @dndxxiangyu
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(){
}
}
后台每个接口check token的是否有效,无效就返回统一编码,你每次请求的时候就判断错误码就行了
我的做法是获取新token对用户来说是无感的,通过Http状态码403来控制,使用Okhttp拦截器来判断是否过期,如果过期重新获取新token。