android--通过OkHttp3拦截token失效

本文介绍了如何在Android应用中使用OkHttp3实现对HTTP请求的拦截,当接收到401响应时,自动进行Token刷新,并重新发送请求。详细流程包括:1. 请求接口;2. 检查401状态码;3. 刷新Token;4. 重新发起请求。关键在于自定义TokenInterceptor并将其添加到OkHttpBuilder的拦截器链中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体流程:

1. 请求一接口:比如 test

2.先拦截test的http code:若是401则拦截,再通过refreshToken获取最新的access_token及refresh_token,

3.再通过Request重新触发请求,请求test接口

 

话不多说,直接贴代码

首先创建okHttpBuilder
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .connectTimeout(30, TimeUnit.SECONDS);

自定义token拦截器:

public class TokenInterceptor implements Interceptor {

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Request request = chain.request();
        request.newBuilder().header("accessToken", PreferencesUtil.getInstance().getString(PreferencesUtil.Name.ACCESS_TOKEN));
        Response response = chain.proceed(request);
        int responseCode = response.code();
        if (responseCode == ErrorCode.ERR_CODE_401) {
            String refreshToken = PreferencesUtil.getInstance().getString(Preferen
Android 开发中,实现 Token 拦截器用于网络请求的身份验证,可以通过使用 OkHttp 提供的 `Interceptor` 接口来完成。这种机制可以统一处理请求头中 Token 的添加、过期 Token 的刷新以及防止重复请求刷新 Token 等逻辑。 ### 拦截器的基本作用 OkHttp拦截器可以对所有发出的网络请求进行预处理或后处理,例如在请求头中添加 Token、处理响应结果、处理 Token 过期等。拦截器的使用可以极大地简化网络请求的管理,提高代码的可维护性。 ### 实现 Token 添加的拦截器 首先,可以实现一个拦截器,用于在每次请求时自动添加 Token 到请求头中。假设 Token 存储在本地或内存中,可以使用如下代码实现: ```java public class AddTokenInterceptor implements Interceptor { private String token; public AddTokenInterceptor(String token) { this.token = token; } @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); if (token == null || token.isEmpty()) { return chain.proceed(originalRequest); } Request newRequest = originalRequest.newBuilder() .header("Authorization", "Bearer " + token) .build(); return chain.proceed(newRequest); } } ``` 该拦截器会在每个请求的 Header 中添加 `Authorization` 字段,值为 `Bearer + Token`,适用于大多数基于 Token 的身份验证机制[^4]。 ### 实现 Token 刷新的拦截器 在 Token 有过期时间的情况下,需要实现 Token 的刷新机制。可以使用另一个拦截器来处理 Token 失效的情况,并在必要时重新获取 Token。通常的做法是拦截返回 401 状态码的响应,并触发 Token 刷新逻辑。 ```java public class RefreshTokenInterceptor implements Interceptor { private Context context; public RefreshTokenInterceptor(Context context) { this.context = context; } @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Response response = chain.proceed(originalRequest); if (response.code() == 401) { // 执行刷新 Token 的逻辑 String newToken = refreshToken(context); if (newToken != null && !newToken.isEmpty()) { // 使用新 Token 重新构建请求 Request newRequest = originalRequest.newBuilder() .header("Authorization", "Bearer " + newToken) .build(); return chain.proceed(newRequest); } } return response; } private String refreshToken(Context context) { // 实现刷新 Token 的具体逻辑,如调用接口获取新 Token return "new_token"; } } ``` 上述代码中,拦截器检测到响应状态码为 401 时,尝试刷新 Token 并重新发送请求。此方法适用于 Token 有效期较短的场景,确保用户不会因 Token 失效而频繁登录[^1]。 ### 防止重复刷新 Token 在多个请求同时执行的情况下,可能会出现多个线程同时检测到 Token 失效并尝试刷新 Token 的问题。为了避免这种情况,可以引入同步机制,例如使用 `synchronized` 或 `ReentrantLock` 来确保 Token 刷新操作是线程安全的。 ```java private final Object lock = new Object(); private boolean isRefreshing = false; private String currentToken; private String refreshToken(Context context) { synchronized (lock) { if (!isRefreshing) { isRefreshing = true; // 执行刷新 Token 的网络请求 currentToken = performTokenRefresh(); isRefreshing = false; } return currentToken; } } private String performTokenRefresh() { // 实际刷新 Token 的逻辑 return "refreshed_token"; } ``` 通过这种方式,可以确保在多个请求同时失败时,只执行一次 Token 刷新操作,从而避免多次请求刷新 Token 导致的问题[^3]。 ### 拦截器的注册 最后,需要将上述拦截器注册到 OkHttp 的 `OkHttpClient` 实例中。可以按如下方式注册: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new AddTokenInterceptor("your_token")) .addInterceptor(new RefreshTokenInterceptor(context)) .build(); ``` 通过将多个拦截器串联使用,可以实现对网络请求的全面控制,包括自动添加 Token、处理 Token 过期以及防止重复刷新 Token 等功能[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值