Explorar o código

扩展core-retrofit,除注解配置方法外,增加单纯由参数控制的动态鉴权信息

Signed-off-by: luoshi <luoshi@qmth.com.cn>
luoshi %!s(int64=3) %!d(string=hai) anos
pai
achega
3bdeb4f477

+ 6 - 0
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/config/RetrofitAutoConfiguration.java

@@ -1,5 +1,7 @@
 package com.qmth.boot.core.retrofit.config;
 
+import com.qmth.boot.core.retrofit.interfaces.CustomizeRetrofitConfiguration;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 
@@ -7,4 +9,8 @@ import org.springframework.context.annotation.Configuration;
 @ComponentScan("com.qmth.boot.core.retrofit.*")
 public class RetrofitAutoConfiguration {
 
+    @Bean
+    CustomizeRetrofitConfiguration.VoidRetrofitConfiguration voidRetrofitConfiguration() {
+        return new CustomizeRetrofitConfiguration.VoidRetrofitConfiguration();
+    }
 }

+ 1 - 5
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/core/RetrofitFactoryBean.java

@@ -7,7 +7,6 @@ import com.qmth.boot.core.retrofit.interceptor.LoggingInterceptor;
 import com.qmth.boot.core.retrofit.interceptor.RetryInterceptor;
 import com.qmth.boot.core.retrofit.interceptor.SignatureInterceptor;
 import com.qmth.boot.core.retrofit.interfaces.CustomizeRetrofitConfiguration;
-import com.qmth.boot.core.retrofit.interfaces.SignatureProvider;
 import okhttp3.ConnectionPool;
 import okhttp3.OkHttpClient;
 import org.apache.commons.lang3.StringUtils;
@@ -76,10 +75,7 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
         OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder().connectionPool(new ConnectionPool());
 
         // add signature interceptor
-        SignatureProvider provider = customize.getSignature();
-        if (provider != null) {
-            okHttpClientBuilder.addInterceptor(new SignatureInterceptor(provider));
-        }
+        okHttpClientBuilder.addInterceptor(new SignatureInterceptor(customize.getSignature()));
 
         // add ErrorDecodeInterceptor
         okHttpClientBuilder.addInterceptor(new ErrorDecodeInterceptor());

+ 25 - 7
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/interceptor/SignatureInterceptor.java

@@ -1,6 +1,7 @@
 package com.qmth.boot.core.retrofit.interceptor;
 
 import com.qmth.boot.core.retrofit.interfaces.SignatureProvider;
+import com.qmth.boot.core.retrofit.utils.SignatureInfo;
 import com.qmth.boot.tools.signature.SignatureEntity;
 import okhttp3.Interceptor;
 import okhttp3.Request;
@@ -26,13 +27,30 @@ public class SignatureInterceptor implements Interceptor {
     @Override
     public Response intercept(Chain chain) throws IOException {
         Request request = chain.request();
-        long time = System.currentTimeMillis();
-        String signature = SignatureEntity
-                .build(provider.getType(), request.method(), request.url().uri().getPath(), time,
-                        provider.getIdentity(), provider.getSecret());
-        return chain.proceed(request.newBuilder().removeHeader(HEADER_KEY_TIME).removeHeader(HEADER_KEY_AUTHORIZATION)
-                .addHeader(HEADER_KEY_TIME, String.valueOf(time)).addHeader(HEADER_KEY_AUTHORIZATION, signature)
-                .build());
+        SignatureProvider provider = this.provider;
+        if (provider == null) {
+            provider = getSignatureInfo(request);
+        }
+        if (provider != null) {
+            long time = System.currentTimeMillis();
+            String signature = SignatureEntity
+                    .build(provider.getType(), request.method(), request.url().uri().getPath(), time,
+                            provider.getIdentity(), provider.getSecret());
+            return chain.proceed(
+                    request.newBuilder().removeHeader(SignatureInfo.HEADER_NAME).removeHeader(HEADER_KEY_TIME)
+                            .removeHeader(HEADER_KEY_AUTHORIZATION).addHeader(HEADER_KEY_TIME, String.valueOf(time))
+                            .addHeader(HEADER_KEY_AUTHORIZATION, signature).build());
+        } else {
+            return chain.proceed(request);
+        }
+    }
+
+    private SignatureInfo getSignatureInfo(Request request) {
+        try {
+            return SignatureInfo.parse(request.header(SignatureInfo.HEADER_NAME));
+        } catch (Exception e) {
+            return null;
+        }
     }
 
 }

+ 57 - 0
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/utils/SignatureInfo.java

@@ -0,0 +1,57 @@
+package com.qmth.boot.core.retrofit.utils;
+
+import com.qmth.boot.core.retrofit.interfaces.SignatureProvider;
+import com.qmth.boot.tools.signature.SignatureType;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 调用方动态提供的签名信息,替代容器管理的静态配置
+ */
+public class SignatureInfo implements SignatureProvider {
+
+    public static final String HEADER_NAME = "signature-info";
+
+    private static final String JOINER = "\t";
+
+    private SignatureType type;
+
+    private String identity;
+
+    private String secret;
+
+    public SignatureInfo(SignatureType type, String identity, String secret) {
+        this.type = type;
+        this.identity = identity;
+        this.secret = secret;
+    }
+
+    @Override
+    public SignatureType getType() {
+        return type;
+    }
+
+    @Override
+    public String getIdentity() {
+        return identity;
+    }
+
+    @Override
+    public String getSecret() {
+        return secret;
+    }
+
+    @Override
+    public String toString() {
+        return type.getName() + JOINER + identity + JOINER + secret;
+    }
+
+    public static SignatureInfo parse(String value) {
+        String[] values = StringUtils.split(StringUtils.trimToEmpty(value), JOINER);
+        if (values.length == 3) {
+            return new SignatureInfo(SignatureType.findByName(values[0]), values[1], values[2]);
+        } else {
+            return null;
+        }
+    }
+
+}

+ 0 - 37
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/utils/ThreadLocalSignatureProvider.java

@@ -1,37 +0,0 @@
-package com.qmth.boot.core.retrofit.utils;
-
-import com.qmth.boot.core.retrofit.interfaces.SignatureProvider;
-import com.qmth.boot.tools.signature.SignatureType;
-
-/**
- * 基于ThreadLocal的动态签名信息容器
- */
-public class ThreadLocalSignatureProvider implements SignatureProvider {
-
-    private ThreadLocal<SignatureType> signatureType = new ThreadLocal<>();
-
-    private ThreadLocal<String> identity = new ThreadLocal<>();
-
-    private ThreadLocal<String> secret = new ThreadLocal<>();
-
-    public void setValue(SignatureType type, String identity, String secret) {
-        this.signatureType.set(type);
-        this.identity.set(identity);
-        this.secret.set(secret);
-    }
-
-    @Override
-    public SignatureType getType() {
-        return signatureType.get();
-    }
-
-    @Override
-    public String getIdentity() {
-        return identity.get();
-    }
-
-    @Override
-    public String getSecret() {
-        return secret.get();
-    }
-}