Jelajahi Sumber

【新增】feign信息透传

zhuzhoutong 5 tahun lalu
induk
melakukan
91ee555e6d

+ 38 - 0
framework-boot/src/main/java/com/mrxu/framework/boot/feign/FeignAutoConfiguration.java

@@ -0,0 +1,38 @@
+package com.mrxu.framework.boot.feign;
+
+import com.mrxu.framework.boot.handle.UserInfoHandler;
+import feign.RequestInterceptor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 功能概要:[] <br>
+ *
+ * @author zzt
+ * @date 2020/10/14
+ */
+@Configuration
+@ConditionalOnClass({ RequestInterceptor.class })
+public class FeignAutoConfiguration {
+
+    /**
+     * feign调用前拦截器
+     * @return 拦截器
+     */
+    @Bean
+    @ConditionalOnMissingBean(FeignRequestInterceptor.class)
+    public RequestInterceptor requestInterceptor() {
+        return new FeignRequestInterceptor();
+    }
+
+    /**
+     * 用户信息拦截器
+     * @return 用户信息拦截器
+     */
+    @Bean
+    public UserInfoHandler userInfoHandler() {
+        return new UserInfoHandler();
+    }
+}

+ 36 - 0
framework-boot/src/main/java/com/mrxu/framework/boot/feign/FeignRequestInterceptor.java

@@ -0,0 +1,36 @@
+package com.mrxu.framework.boot.feign;
+
+import com.mrxu.framework.boot.entity.RpcRequestInfo;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 功能概要:[feign拦截器主要用于透传用户信息等数据] <br>
+ *
+ * @author zzt
+ * @date 2020/10/14
+ */
+public class FeignRequestInterceptor implements RequestInterceptor {
+
+    /**
+     * 请求前设置header信息
+     * @param requestTemplate 请求对象
+     */
+    @Override
+    public void apply(RequestTemplate requestTemplate) {
+        RpcRequestInfo requestInfo = RpcRequestInfo.get();
+        if(StringUtils.isNotBlank(requestInfo.getIp())){
+            requestTemplate.header(HeaderConstant.IP,requestInfo.getIp());
+        }
+        if(StringUtils.isNotBlank(requestInfo.getMerchantId())){
+            requestTemplate.header(HeaderConstant.MERCHANT_ID,requestInfo.getMerchantId());
+        }
+        if(StringUtils.isNotBlank(requestInfo.getUsername())){
+            requestTemplate.header(HeaderConstant.USER_NAME,requestInfo.getUsername());
+        }
+        if(StringUtils.isNotBlank(requestInfo.getTrackId())){
+            requestTemplate.header(HeaderConstant.TRACK_ID,requestInfo.getTrackId());
+        }
+    }
+}

+ 30 - 0
framework-boot/src/main/java/com/mrxu/framework/boot/feign/HeaderConstant.java

@@ -0,0 +1,30 @@
+package com.mrxu.framework.boot.feign;
+
+/**
+ * 功能概要:[header常量类] <br>
+ *
+ * @author zzt
+ * @date 2020/10/14
+ */
+public interface HeaderConstant {
+
+    /**
+     * 链路追踪id
+     */
+    public static final String TRACK_ID = "track_id";
+
+    /**
+     * 租户id
+     */
+    public static final String MERCHANT_ID = "merchant_id";
+
+    /**
+     * 当前登录名称
+     */
+    public static final String USER_NAME = "user_name";
+
+    /**
+     * 登录者ip
+     */
+    public static final String IP = "ip";
+}

+ 53 - 0
framework-boot/src/main/java/com/mrxu/framework/boot/handle/UserInfoHandler.java

@@ -0,0 +1,53 @@
+package com.mrxu.framework.boot.handle;
+
+import com.mrxu.framework.boot.entity.RpcRequestInfo;
+import com.mrxu.framework.boot.feign.HeaderConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 功能概要:[当前登录者的用户信息] <br>
+ *
+ * @author zzt
+ * @date 2020/10/14
+ */
+@Slf4j
+public class UserInfoHandler extends HandlerInterceptorAdapter {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
+        //获取设置头部信息
+        RpcRequestInfo requestInfo = RpcRequestInfo.get();
+        if(requestInfo.getMerchantId() != null){
+            //已经设置过当前登录信息
+            return true;
+        }
+        String trackId = request.getHeader(HeaderConstant.TRACK_ID);
+        if (StringUtils.isNotBlank(trackId)) {
+            requestInfo.setTrackId(trackId);
+        }
+        String ip = request.getHeader(HeaderConstant.IP);
+        if (StringUtils.isNotBlank(ip)) {
+            requestInfo.setIp(ip);
+        }
+        String merchantId = request.getHeader(HeaderConstant.MERCHANT_ID);
+        if (StringUtils.isNotBlank(merchantId)) {
+            requestInfo.setMerchantId(merchantId);
+        }
+        String userName = request.getHeader(HeaderConstant.USER_NAME);
+        if (StringUtils.isNotBlank(userName)) {
+            requestInfo.setUsername(userName);
+        }
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
+        //清理当前登录者信息
+        RpcRequestInfo.remove();
+    }
+}