碰到一个需求, 需要全局拦截掉登录信息. 但是, 每个请求里面都写, 有点丑.
目标:
1. 需要在拦截器里
2. 需要获取到response的信息
3. 需要返回不同的response.
public class TokenInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
ResponseBody responseBody = response.body();
if (responseBody != null) {
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
try {
String result = buffer.clone().readString(StandardCharsets.UTF_8);
JSONObject jsonObject = new JSONObject(result);
int code = jsonObject.getInt("code");
if (/*你妈妈不准你上网*/) {
boolean isLogin = SharedPreferencesUtils.get(Constants.USER, Constants.UserInfo.IS_LOGIN, false);
// 你妈妈不准你上网
if (isLogin) {
// 刷新信息
RxBus.get().post(new UserTokenExpiredEvent());
}
return new okhttp3.Response.Builder()
.code(code) // 其实code可以随便给
.protocol(Protocol.HTTP_2)
.message(jsonObject.optString("msg", ""))
.body(ResponseBody.create(MediaType.get("text/html; charset=utf-8"), "")) // 返回空页面
.request(chain.request())
.build();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
}