[英]Android retrofit repeat request after token expired?
我正在使用 Retrofit 与我的服务器进行通信。 我必须先调用登录端点,然后我得到一个 cookie(身份验证令牌),我会自动存储它,并且正在授权以下请求。 如果 1 小时内没有请求,则此“会话”将过期。
我应该如何进行自动重新认证? 显然这不是一个好主意,我在每次“真实”请求之前用用户名/密码 ping 登录端点,以确保我的客户端尚未过期。
我尝试向 okHttpClient 添加拦截器,并检查我的“真实”响应(不是登录)是否返回代码 401。在这种情况下,我应该调用登录端点,然后,我必须重复“真实”调用。
如何“保存”请求,调用登录,然后在我再次通过身份验证时重复第一个请求?
private static Retrofit retrofit;
public static Retrofit getClient( final Context context ) {
if ( retrofit == null ) {
ClearableCookieJar cookieJar =
new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
final OkHttpClient okHttpClient =
new OkHttpClient.Builder()
.followSslRedirects(false)
.followRedirects(false)
.cookieJar(cookieJar)
.addInterceptor(chain -> {
Request request = chain.request();
Response response = chain.proceed(request);
if ( response.code() == 401 ) {
if ( !response.message().contains("Incorrect") ) {
// THIS IS THE CASE, when I try to call an endpoint with expired token
// I need to call login again, and then repeat this failed request
}
}
return response;
})
.build();
retrofit = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
显然我可以手动检查每个请求的响应代码,如果是 401,我调用 login,当它完成时,我再次调用我的请求。 但我希望有一个更简单的(带有拦截器的内置解决方案,所以我不必在任何地方实现这个逻辑)
登录响应后,保存令牌,然后携带此令牌与服务器通信,这样用户就不需要再次登录了。
当应用程序在任何请求期间收到类似“401:过期令牌”的响应时,只需删除保存的令牌和所有用户数据并显示一个对话框让用户跳转到 LoginActivity。 然后重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.