ThreadLocal +拦截器 处理参数
1、构建ThreadContext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package com.ne.ice.boot.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; public class ThreadContext { private static final Logger log = LoggerFactory.getLogger(ThreadContext. class ); public static final String SUBJECT_KEY = ThreadContext. class .getName() + "_SUBJECT_KEY" ; private static final ThreadLocal<Map<Object, Object>> resources = new InheritableThreadLocalMap<Map<Object, Object>>(); protected ThreadContext() { } public static Map<Object, Object> getResources() { return resources != null ? new HashMap<Object, Object>(resources.get()) : null ; } public static void setResources(Map<Object, Object> newResources) { if (isEmpty(newResources)) { return ; } resources.get().clear(); resources.get().putAll(newResources); } public static boolean isEmpty(Map<?, ?> map) { return (map == null || map.isEmpty()); } private static Object getValue(Object key) { return resources.get().get(key); } public static <T> T get(Object key) { if (log.isTraceEnabled()) { String msg = "get() - in thread [" + Thread.currentThread().getName() + "]" ; log.trace(msg); } Object value = getValue(key); if ((value != null ) && log.isTraceEnabled()) { String msg = "Retrieved value of type [" + value.getClass().getName() + "] for key [" + key + "] " + "bound to thread [" + Thread.currentThread().getName() + "]" ; log.trace(msg); } return (T) value; } public static void put(Object key, Object value) { if (key == null ) { throw new IllegalArgumentException( "key cannot be null" ); } if (value == null ) { remove(key); return ; } resources.get().put(key, value); if (log.isTraceEnabled()) { String msg = "Bound value of type [" + value.getClass().getName() + "] for key [" + key + "] to thread " + "[" + Thread.currentThread().getName() + "]" ; log.trace(msg); } } public static Object remove(Object key) { Object value = resources.get().remove(key); if ((value != null ) && log.isTraceEnabled()) { String msg = "Removed value of type [" + value.getClass().getName() + "] for key [" + key + "]" + "from thread [" + Thread.currentThread().getName() + "]" ; log.trace(msg); } return value; } public static void remove() { resources.remove(); } private static final class InheritableThreadLocalMap<T extends Map<Object, Object>> extends InheritableThreadLocal<Map<Object, Object>> { protected Map<Object, Object> initialValue() { return new HashMap<Object, Object>(); } @SuppressWarnings ({ "unchecked" }) protected Map<Object, Object> childValue(Map<Object, Object> parentValue) { if (parentValue != null ) { return (Map<Object, Object>) ((HashMap<Object, Object>) parentValue).clone(); } else { return null ; } } } } |
2、编写拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.gw.manage.cms.interceptor; import com.ne.ice.boot.common.ThreadContext; import org.apache.commons.lang.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import static com.gw.manage.cms.interceptor.DataFilterInterceptor.*; public class DataFilterHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { ThreadContext.put(CLIENT_ID_KEY, request.getHeader(CLIENT_ID_KEY)); ThreadContext.put(BRAND_ID_KEY, request.getHeader(BRAND_ID_KEY)); ThreadContext.put(DEALER_SHOP_IDS_KEY, StringUtils.split(request.getHeader(DEALER_SHOP_IDS_KEY), "," )); ThreadContext.put(BRAND_IDS_KEY, StringUtils.split(request.getHeader(BRAND_IDS_KEY), "," )); ThreadContext.put(EMPLOYEE_ID_KEY, request.getHeader(EMPLOYEE_ID_KEY)); return true ; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ThreadContext.remove(CLIENT_ID_KEY); ThreadContext.remove(BRAND_ID_KEY); ThreadContext.remove(DEALER_SHOP_IDS_KEY); ThreadContext.remove(BRAND_IDS_KEY); ThreadContext.remove(EMPLOYEE_ID_KEY); } } |
拦截器取得每次请求的常用参数,放到线程变量中去
标签:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了