2

我是 android 开发的新手,曾经用 JavaScript 开发。一种常见的做法是实现一个拦截器来添加Authorization标题。在我目前的应用程序中没有什么不同。在这个新世界对我来说,SharedPreferences是相当的LocalStorage。但是要访问第一个,我必须使用Context.

这是我的问题:要获取存储在方法SharedPreferences内部的令牌,intercept我必须将 a 传递ContextInterceptor,但流程直到有许多类:服务、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,尽管那里很乱(对不起)。总而言之,我不想将它作为参数传递给这个“上帝”类。有第三种方法吗?

4

0 回答 0