android [Interceptor]

时间:2019-07-10 00:15:41

标签: java android retrofit okhttp3

我是android开发的新手,曾经使用JavaScript进行开发。常见的做法是实现拦截器以添加Authorization头。在我目前的应用中没有什么不同。在我这个新世界中,SharedPreferencesLocalStorage相当。但是要访问第一个,我必须使用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”类,也不想。有第三种方法吗?

0 个答案:

没有答案