石家庄网站建设登录,织梦网站模板源码php,网页微信登录,wordpress模板仿在开发过程中#xff0c;很多时候我们会使用ThreadLocal来临时缓存数据#xff0c;当一次数据请求执行完成后需要主动执行释放当前ThreadLocal缓存数据资源#xff0c;防止未能及时释放导致下一次访问时候ThreadLocal依然保持上一次缓存的数据。
spring提供两种方式去监听一…在开发过程中很多时候我们会使用ThreadLocal来临时缓存数据当一次数据请求执行完成后需要主动执行释放当前ThreadLocal缓存数据资源防止未能及时释放导致下一次访问时候ThreadLocal依然保持上一次缓存的数据。
spring提供两种方式去监听一次请求完成事件。 1、HandlerInterceptor - afterCompletion 使用拦截方式再执行完成后执行afterCompletion 2、ApplicationListener - ServletRequestHandledEvent ApplicationListener 提供的是监听那种事件类型ServletRequestHandledEvent 就是一次请求结束后的事件。
通过上述两种方式可以很方便的在一次请求完成移除当前线程ThreadLocal。
ThreadLocal 工具
public class ThreadLocal2UserSessionUtil {private static final ThreadLocalObject LOCAL new ThreadLocal();/*** 设置数据** param paramMap*/public static void set(MapString, Object paramMap) {LOCAL.set(paramMap);}/*** 获取值** return*/public static MapString, Object get() {if (Objects.isNull(LOCAL.get())) {return new HashMap();} else {return (MapString, Object) LOCAL.get();}}/*** 获取值** return*/public static Object get(String key) {MapString, Object resMap (MapString, Object) LOCAL.get();if (null resMap) {return null;}return (null ! resMap.get(key)) ? resMap.get(key) : null;}/*** 每次取出数据后必须清空 否则就会出现值重复*/public static void remove() {LOCAL.remove();}/*** 获取app登录token** return*/public static String getToken4App() {MapString, Object map get();return (null map) ? : (String) map.get(EncryptReqParamNameConstant.PARAM_TOKEN);}/*** 初始化数值** return*/public static void pushUserToken4App(String appToken) {MapString, Object localMap get();if (StringUtil.isNotBlank(appToken)) {localMap.put(EncryptReqParamNameConstant.PARAM_TOKEN, appToken);set(localMap);}}/*** 初始化数值** return*/public static void pushUserId4App(Long userId) {MapString, Object localMap get();if (null ! userId) {localMap.put(EncryptReqParamNameConstant.USER_ID, userId);set(localMap);}}/*** 初始化数值 注意这里只有加解密才将用户id放入** return*/public static Long getUserId4App() {MapString, Object map get();return (null map) ? null : (Long) map.get(EncryptReqParamNameConstant.USER_ID);}
}HandlerInterceptor 方式
Slf4j
Component
public class ThreadLocalRemoveInterceptor implements HandlerInterceptor {Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);ThreadLocal2UserSessionUtil.remove();}
}在web控制器中加入监听器
Configuration
public class PathPrefixMvcConfigurer implements WebMvcConfigurer {Autowiredprivate ThreadLocalRemoveInterceptor threadLocalRemoveInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(threadLocalRemoveInterceptor).addPathPatterns(/*);}
}2、通过监听器方式
Slf4j
Component
public class ServletRequestHandledEventListener implements ApplicationListenerServletRequestHandledEvent {Overridepublic void onApplicationEvent(ServletRequestHandledEvent event) {ThreadLocal2UserSessionUtil.remove();}
}完成