我是 android 开发的新手,曾经用 JavaScript 开发。一种常见的做法是实现一个拦截器来添加Authorization标题。在我目前的应用程序中没有什么不同。在这个新世界对我来说,SharedPreferences是相当的LocalStorage。但是要访问第一个,我必须使用Context.
这是我的问题:要获取存储在方法SharedPreferences内部的令牌,intercept我必须将 a 传递Context给Interceptor,但流程直到有许多类:服务、Retrofit处理程序、okhttp3客户端,然后是Interceptor它本身。
我正在研究它一段时间,我发现的两种方法是:将Context所有这些流作为参数传递或创建一个“上帝”类,仅将应用程序上下文作为static方法保留在手边。
现在,我正在使用第一个,如下所示。
public class APIRESTInterceptor implements Interceptor {
private static final List<String> noAuthRequirements = new ArrayList<>(Arrays.asList("/api/app/login", "/api/app/token/refresh"));
private static Context context;
public APIRESTInterceptor(Context context) {
setContext(context);
}
public static void setContext(Context context) {
APIRESTInterceptor.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String requestPath = request.url().encodedPath();
if (!noAuthRequirements.contains(requestPath)) {
String accessToken = SessionUtils.readOfSharedPreferences(context).getAccess();
request = request.newBuilder().addHeader("Authorization", accessToken).build();
}
return chain.proceed(request);
}
}
我想从你们那里得到什么,人们:一个更简单的策略,更像是在 JavaScript 中完成的访问LocalStorage,尽管那里很乱(对不起)。总而言之,我不想将它作为参数传递给这个“上帝”类。有第三种方法吗?