我是android开发的新手,曾经使用JavaScript进行开发。常见的做法是实现拦截器以添加Authorization
头。在我目前的应用中没有什么不同。在我这个新世界中,SharedPreferences
与LocalStorage
相当。但是要访问第一个,我必须使用Context
。
这是我的问题:要获得存储在SharedPreferences
中的令牌,该令牌位于intercept
方法内部,我必须将Context
传递给Interceptor
,但是流直到那里有很多类:服务,Retrofit
处理程序,okhttp3
客户端以及Interceptor
本身。
我正在挖掘它一段时间,我发现了两种方法:将Context
作为参数传递给所有这些流,或者仅创建“ God”类以将Application 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
的方法,尽管那里很混乱(抱歉)。总而言之,我既不想将此参数作为参数传递给“ God”类,也不想。有第三种方法吗?