Commit e4a77357 authored by huangcb's avatar huangcb

Feign/数据权限,功能优化

parent 28da5c33
package com.esv.freight.customer.common.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.esv.freight.customer.common.util.ReqUtils;
import com.esv.gateway.common.GatewayHeaders;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
/**
* @description: Feign请求拦截器
* @project: freight-customer-service
* @name: com.esv.freight.customer.common.interceptor.FeignRequestInterceptor
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/06/11 9:17
* @version:1.0
*/
@Slf4j
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Value("${spring.application.name}")
private String applicationName;
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("trace_id", MDC.get("traceId"));
requestTemplate.header("application_name", applicationName);
Class cls = GatewayHeaders.class;
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
f.setAccessible(true);
String key;
try {
key = String.valueOf(f.get(cls));
requestTemplate.header(key, ReqUtils.getRequestHeader(key));
} catch (IllegalAccessException e) {
log.error(e.getMessage(), e);
}
}
// 判断header是否有租户信息
boolean isTenant = false;
Map<String, Collection<String>> headers = requestTemplate.headers();
for (Map.Entry<String, Collection<String>> entry : headers.entrySet()) {
if (GatewayHeaders.TENANT_ID.equals(entry.getKey())) {
isTenant = true;
break;
}
}
// 设置租户信息及数据权限(0-全部;1-租户;2-部门)
if (!isTenant) {
byte[] bytes = requestTemplate.requestBody().asBytes();
if (null == bytes) {
requestTemplate.header(GatewayHeaders.DATA_PERM, "0");
} else {
String bodyStr = new String(bytes);
JSONObject bodyJson = JSONObject.parseObject(bodyStr);
if (!bodyJson.isEmpty() && bodyJson.containsKey(GatewayHeaders.TENANT_ID)) {
requestTemplate.header(GatewayHeaders.TENANT_ID, bodyJson.getString(GatewayHeaders.TENANT_ID));
requestTemplate.header(GatewayHeaders.DATA_PERM, "1");
bodyJson.remove(GatewayHeaders.TENANT_ID);
bodyStr = bodyJson.toJSONString();
requestTemplate.body(Request.Body.encoded(bodyStr.getBytes(requestTemplate.requestCharset()), requestTemplate.requestCharset()));
} else {
requestTemplate.header(GatewayHeaders.DATA_PERM, "0");
}
}
}
}
}
......@@ -30,10 +30,12 @@ public class ReqUtils {
public static String getRequestHeader(String headerKey) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null == servletRequestAttributes) {
return null;
Object value = ThreadLocalCacheUtils.getByKey(headerKey);
return null == value ? null : value.toString();
} else {
HttpServletRequest request = servletRequestAttributes.getRequest();
return request.getHeader(headerKey);
}
HttpServletRequest request = servletRequestAttributes.getRequest();
return request.getHeader(headerKey);
}
/**
......
package com.esv.freight.customer.common.util;
import java.util.HashMap;
import java.util.Map;
/**
* @description: ThreadLocal Cache工具类
* @project: freight-customer-service
* @name: com.esv.freight.customer.common.util.ThreadLocalCacheUtils
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/06/11 15:27
* @version:1.0
*/
public class ThreadLocalCacheUtils {
private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
/**
* 向ThreadLocal缓存值
**/
public static void setByKey(String key, Object value) {
Map<String, Object> map = threadLocal.get();
if (null == map) {
map = new HashMap<>(8);
}
map.put(key, value);
threadLocal.set(map);
}
/**
* 从ThreadLocal里获取缓存Key的值
**/
public static Object getByKey(String key) {
Map<String, Object> map = threadLocal.get();
if (null == map) {
return null;
} else {
return map.get(key);
}
}
/**
* 从ThreadLocal里移除缓存Key
**/
public static void removeByKey(String key) {
Map<String, Object> map = threadLocal.get();
if (null != map) {
map.remove(key);
threadLocal.set(map);
}
}
/**
* 从ThreadLocal里获取缓存
**/
public static Object get() {
return threadLocal.get();
}
/**
* 移除当前线程缓存
* 用于释放当前线程ThreadLocal资源
*/
public static void remove() {
threadLocal.remove();
}
}
package com.esv.freight.customer.config;
import com.esv.freight.customer.common.util.ReqUtils;
import com.esv.gateway.common.GatewayHeaders;
import feign.RequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import java.lang.reflect.Field;
/**
* @description: Feign接口配置
* @project: freight-customer-service
......@@ -27,34 +20,9 @@ import java.lang.reflect.Field;
@Slf4j
public class FeignConfigure {
@Value("${spring.application.name}")
private String applicationName;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public RequestInterceptor requestInterceptor() {
RequestInterceptor requestInterceptor = ((requestTemplate -> {
requestTemplate.header("trace_id", MDC.get("traceId"));
requestTemplate.header("application_name", applicationName);
Class cls = GatewayHeaders.class;
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
f.setAccessible(true);
String key;
try {
key = String.valueOf(f.get(cls));
requestTemplate.header(key, ReqUtils.getRequestHeader(key));
} catch (IllegalAccessException e) {
log.error(e.getMessage(), e);
}
}
}));
return requestInterceptor;
}
}
package com.esv.freight.customer.module.test.controller;
import com.esv.freight.customer.common.response.EResponse;
import com.esv.freight.customer.common.util.ThreadLocalCacheUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -25,4 +26,17 @@ public class TestController {
return EResponse.ok();
}
@GetMapping("/test1")
public EResponse test1() {
ThreadLocalCacheUtils.setByKey("thread", "test1");
log.info(ThreadLocalCacheUtils.getByKey("thread").toString());
return EResponse.ok(ThreadLocalCacheUtils.getByKey("thread").toString());
}
@GetMapping("/test2")
public EResponse test2() {
ThreadLocalCacheUtils.setByKey("thread", "test2");
log.info(ThreadLocalCacheUtils.getByKey("thread").toString());
return EResponse.ok(ThreadLocalCacheUtils.getByKey("thread").toString());
}
}
package com.esv.freight.customer.common.util;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @description:
* @project: freight-customer-service
* @name: com.esv.freight.customer.common.util.ThreadLocalCacheUtilsTest
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/06/11 15:57
* @version:1.0
*/
@SpringBootTest
@Slf4j
public class ThreadLocalCacheUtilsTest {
@Test
public void test() {
ThreadLocalCacheUtils.setByKey("time", System.currentTimeMillis());
log.info("{}", ThreadLocalCacheUtils.getByKey("time").toString());
log.info("{}", ThreadLocalCacheUtils.get().toString());
ThreadLocalCacheUtils.remove();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment