use*_*156 5 java authentication android retrofit retrofit2
当我在我的应用程序中登录我的帐户时,我在我的SharedPreferences中保存了一个身份验证令牌,如下所示:
PreferenceUtils.setAuthToken(LoginActivity.this, authToken);
Run Code Online (Sandbox Code Playgroud)
这是我的PreferenceUtils班级:
public class PreferenceUtils {
public static SharedPreferences getSharedPreferences(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
public static String getAuthToken(Context context) {
SharedPreferences sp = getSharedPreferences(context);
return sp.getString("auth_token", null);
}
public static void setAuthToken(Context context, final String token) {
SharedPreferences sp = getSharedPreferences(context);
sp.edit().putString("auth_token", token).apply();
}
}
Run Code Online (Sandbox Code Playgroud)
当我退出帐户时,我通过调用logOut()我UserUtils班级中的方法删除了身份验证令牌:
public class UserUtils {
public static void logOut(Context context) {
SharedPreferences prefs = PreferenceUtils.getSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.remove("auth_token");
editor.apply();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,即使在退出我的帐户并从SharedPreferences中删除身份验证令牌之后,所有的Retrofit调用仍然以某种方式保存了身份验证令牌,我不知道如何.
换句话说,当我退出我的帐户并且Retrofit进行新的调用时,它将打印出我认为在用户注销时删除的身份验证令牌.
只有当我重新启动应用程序时,才会完全删除身份验证令牌.
它为什么这样做?
这是我的Retrofit客户端类(注意注释):
public class ApiClient {
public static final String API_BASE_URL = "https://www.example.com/";
private static OkHttpClient.Builder httpClient =
new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
private static Retrofit retrofit = builder.build();
private static HttpLoggingInterceptor logging =
new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY);
public static Retrofit getRetrofit() {
return retrofit;
}
public static <S> S createService(Class<S> serviceClass) {
if (!httpClient.interceptors().contains(logging)) {
httpClient.addInterceptor(logging);
builder.client(httpClient.build());
retrofit = builder.build();
}
return retrofit.create(serviceClass);
}
public static <S> S createService(Class<S> serviceClass, final String authToken) {
if (authToken != null) {
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
// THIS STILL PRINTS THE AUTH TOKEN EVEN AFTER I'VE
// REMOVED IT FROM THE SHARED PREFERENCES
Log.d("AUTH TOKEN", authToken);
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", "Bearer " + authToken)
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
}
OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决??
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |