From 773b9953ad645b39a9efa8ab6d71dfc9d9e4e22e Mon Sep 17 00:00:00 2001 From: hxb <hxb@hdlchina.com.cn> Date: 星期四, 24 十月 2024 11:51:57 +0800 Subject: [PATCH] 补全了所有日志 --- HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 199 insertions(+), 0 deletions(-) diff --git a/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java new file mode 100644 index 0000000..257a41b --- /dev/null +++ b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java @@ -0,0 +1,199 @@ +package com.hdl.linkpm.sdk.core.interceptor; + +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.hdl.hdlhttp.HxHttpConfig; +import com.hdl.linkpm.sdk.core.api.HDLCloudUserApi; +import com.hdl.linkpm.sdk.core.code.HDLCloudCode; +import com.hdl.linkpm.sdk.core.response.BaseInfo; +import com.hdl.linkpm.sdk.user.HDLLinkPMUser; +import com.hdl.linkpm.sdk.user.bean.HDLLoginBean; +import com.hdl.linkpm.sdk.utils.HDLGsonUtils; +import com.hdl.linkpm.sdk.utils.HDLSDKLog; + +import java.io.IOException; +import java.nio.charset.Charset; + +import okhttp3.Headers; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.Buffer; +import okio.BufferedSource; + +/** + * Created by Tong on 2021/11/2. + */ +public class HDLLoginInterceptor implements Interceptor { + + private String TAG =HDLLoginInterceptor.class.getName(); + @NonNull + @Override + public Response intercept(@NonNull Chain chain) throws IOException { + Request request = chain.request(); + if (!isRefreshTokenHeader(request.headers())) { + String token = HDLLinkPMUser.getInstance().getAccessToken(); + HDLSDKLog.i(TAG, "褰撳墠璇锋眰token锛�"+token); + if (!TextUtils.isEmpty(token)) { + Request processRequest = addToken(request, token); + Response processResponse = chain.proceed(processRequest); + return disposeToken(chain, processRequest, processResponse); + } + } + return chain.proceed(request); + } + + @NonNull + private Response disposeToken(Chain chain, Request request, Response response) { + try { + +// ResponseBody responseBody2 = response.body(); +// BufferedSource source2 = responseBody2.source(); +// source2.request(Long.MAX_VALUE); +// Buffer buffer2 = source2.getBuffer().clone(); +// String respString2 = buffer2.readString(Charset.defaultCharset()); + //http鏍囧噯鐘舵�佺爜 + if (401 == response.code() || 402 == response.code() || 403 == response.code()) { + final String token = refreshToken(); + if (!TextUtils.isEmpty(token)) { + return chain.proceed(addToken(request, token)); + } + + } else if (response.isSuccessful()) { + ResponseBody responseBody = response.body(); + if (responseBody != null) { + BufferedSource source = responseBody.source(); + source.request(Long.MAX_VALUE); + Buffer buffer = source.getBuffer().clone(); + String respString = buffer.readString(Charset.defaultCharset()); + JsonObject object = JsonParser.parseString(respString).getAsJsonObject(); + int code = object.get("code").getAsInt(); + //1.鍒ゆ柇token鏄惁杩囨湡鏄惁闇�瑕佸埛鏂皌oken + if (isTokenTimeoutByCode(code)) { + final String token = refreshToken(); + if (!TextUtils.isEmpty(token)) { + return chain.proceed(addToken(request, token)); + } + } + //2.鍒ゆ柇Token鏄惁閿欒 鍙戦�佺櫥鍑哄鐞嗛�氱煡 + if (isTokenNeedReLoginByCode(code)) { + //3.娓呯┖鐧诲綍淇℃伅骞跺彂鍑洪噸鏂扮櫥褰曢�氱煡 + HDLLinkPMUser.getInstance().logout(0); + } + } + + } + + } catch (Exception e) { + Log.d("HDL===>", "disposeToken: 澶辫触," + e); + } + return response; + } + + /** + * 鏍规嵁code鍒ゆ柇token鏄惁澶辨晥 闇�瑕佸埛鏂伴噸鏂皌oken + * + * @param code 涓氬姟code + * @return ture 澶辨晥 + */ + private boolean isTokenTimeoutByCode(int code) { + return HDLCloudCode.TOKEN_TIMEOUT == code; + } + + /** + * 鏍规嵁code鍒ゆ柇token鏄惁澶辨晥 闇�瑕侀噸鏂扮櫥褰曠殑 + * + * @param code 涓氬姟code + * @return ture 澶辨晥 + */ + private boolean isTokenNeedReLoginByCode(int code) { + return HDLCloudCode.RE_LOGIN == code + || HDLCloudCode.TOKEN_NOT_STANDARD == code + || HDLCloudCode.NO_TOKEN == code + || HDLCloudCode.CODE_TOKEN_ERROR_10006 == code + || HDLCloudCode.CODE_TOKEN_ERROR_10009 == code; + } + + + /** + * 鏄惁瀛樺湪鍒锋柊澶� + */ + private boolean isRefreshTokenHeader(Headers headers) { + String signHeader = headers.get(HDLSmartHeader.REFRESH_TOKEN_HEADER); + return !TextUtils.isEmpty(signHeader); + } + + private Request addToken(Request request, String token) { + return request.newBuilder() + .removeHeader("Authorization") + .build() + .newBuilder() + .method(request.method(), request.body()) + .addHeader("Authorization", token) + .build(); + } + + /** + * 鎷︽埅鍣‥ncryptInterceptor浼氬鐞嗗姞瀵� + * + * @return token + */ + private String refreshToken() { + final String cacheRefreshToken = HDLLinkPMUser.getInstance().getRefreshToken(); + HDLSDKLog.i(TAG, "鍒锋柊Token,褰撳墠鍒锋柊Token鏄細"+cacheRefreshToken); + final String regionUrl = HDLCloudUserApi.getRequestUrl(HDLCloudUserApi.POST_LOGIN); + final OkHttpClient client = HxHttpConfig.getInstance().getClient(); + Request.Builder builder = new Request.Builder(); + + final JsonObject json = new JsonObject(); + json.addProperty("refreshToken", cacheRefreshToken); + json.addProperty("grantType", "refresh_token"); + + final RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8")); + builder.post(requestBody); + builder.url(regionUrl); + builder.addHeader(HDLSmartHeader.REFRESH_TOKEN_HEADER, "0"); + try { + Response response = client.newCall(builder.build()).execute(); + if (response.isSuccessful()) { + ResponseBody responseBody = response.body(); + if (responseBody != null) { + BufferedSource source = responseBody.source(); + source.request(Long.MAX_VALUE); + Buffer buffer = source.getBuffer().clone(); + String respString = buffer.readString(Charset.defaultCharset()); + BaseInfo<HDLLoginBean> baseInfo = HDLGsonUtils.fromJson(respString, new TypeToken<BaseInfo<HDLLoginBean>>() { + }.getType()); + if (baseInfo != null) { + HDLSDKLog.i(TAG, "鑾峰彇鍒板埛鏂癟oken鐨勬暟鎹紝鐘舵�佺爜锛�"+baseInfo.getCode()); + if (baseInfo.getCode() == HDLCloudCode.SUCCEED) { + if (baseInfo.getData() != null) { + HDLLoginBean loginBean = baseInfo.getData(); + HDLLinkPMUser.getInstance().updateRefreshToken(loginBean); + return loginBean.getHeaderPrefix() + loginBean.getAccessToken(); + } + } else { + //refreshToken涔熻繃鏈熺殑璇濓紝鍒欏彂鍑虹櫥鍑哄鐞嗛�氱煡锛岄噸鏂扮櫥褰� + //娓呯┖鐧诲綍淇℃伅骞跺彂鍑洪噸鏂扮櫥褰曢�氱煡 + HDLLinkPMUser.getInstance().logout(0); + } + } + } + } + } catch (Exception ignored) { + Log.d("HDL===>", "refreshToken: 澶辫触"); + } + return ""; + } +} -- Gitblit v1.8.0