项目中在登录成功之后获取token,过期之后无法正常请求接口,所以需要在请求接口时需判断token是否过期,由于接口众多,不可能每个接口都进行判断,所以需要全局设置一个拦截器判断token:
/**
* Okhttp接口请求拦截器,判断token是否过期,若token过期则跳转至登录页面
* */
public class TokenInterceptor implements Interceptor {
private SharedPreferences.Editor editor;
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
//根据和服务端的约定判断token过期
if (isTokenExpired(response)) {
//token过期 跳转到登录页
Intent intent = new Intent(UniteApp.getContext(), LoginActivity.class);//LOGIN为注册表里添加
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
UniteApp.getContext().startActivity(intent);
//清空登录信息
editor = UniteApp.getContext().getSharedPreferences("userinfo", Context.MODE_PRIVATE).edit();
editor.remove("token");
editor.apply();
}
return response;
}
/**
* 根据Response,判断Token是否失效
*/
private boolean isTokenExpired(Response response) {
if (response.code() == 401) {
return true;
}
return false;
}
}
定义拦截器之后需要在构建OkhttpClient对象时设置
.addInterceptor(new TokenInterceptor()) //添加判断token是否过期的拦截器
设置好之后每次请求接口时会对token是否过期进行判断,拦截器内可以对token过期进行逻辑处理,可以返回登录界面,也可以无痕获取(继续获取token并再次请求接口)