最近在维护一个老(很老)系统,本想重构,但是目前没这个时间,基于struts1+dao,有些还是jsp+dao的方式,用户需要在敏感的操作上加比较详细的日志,日志的功能在dao根据需求手动写入,主要的问题是原有的接口没有传入request的相关信息,比如用户信息,我想到了ThreadLocal,因为每个servlet是基于多线程,但是每个request的执行是再一个独立的线程中完成,ThreadLocal正适合了我这种需求,可以用来完成我对这个系统的业务扩展。
在比如struts2的ServletActionContext中对request的获取,还有hibernate中对sessin的管理就是基于ThreadLocal来实现。
看了下ThreadLocal的源码,相对简单,主要的思路是在每个Thread中维护一个ThreadLocalMap,调用ThreadLocal的set(T value)的时候,以当前的ThreadLocal实例为key保存到当前线程的ThreadLocalMap中。
关键源码如下:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
理解了上面的以后,使用起来就方便了。我的地体实现如在
1.在web.xml中配置系统每个请求都经过的过滤器
<filter>
<filter-name>AppRequestFilter</filter-name>
<filter-class>com.clifford.restaurant.AppRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AppRequestFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AppRequestFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
2.过滤器实现
public class AppRequestFilter implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = ((HttpServletRequest)arg0);
RequestThreadLocal.setRequestThreadLocal(request);
filterChain.doFilter(request, response);
}
}
3.ThreadLocal相关实现
public class RequestThreadLocal {
private static ThreadLocal<HttpServletRequest> requestThreadLocal = new ThreadLocal<HttpServletRequest>();
public static void setRequestThreadLocal(HttpServletRequest request) {
requestThreadLocal.set(request);
}
public static User getLoginUser() {
HttpServletRequest request = requestThreadLocal.get();
Session session = request==null?null:request.getSession(false);
return session==null?null:(User)session.getAttribute(IConstants.USER_KEY);
}
public static String getRequestIp() {
HttpServletRequest request = requestThreadLocal.get();
return request==null?"":request.getRemoteHost();
}
}
分享到:
相关推荐
ThreadLocal原理及在多层架构中的应用
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 ...
一、简介 ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。...根据源码,画出ThreadLocal原理图 原创文章
第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52...
第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52...
掌握ThreadLocal原理 掌握常用的GoF和J2EE设计模式 掌握分层架构思想 了解SCM 了解XML,XSL、DTD和Schema 了解异构系统整合模式,了解Web Services技术体系 掌握建模工具Rational Rose和PowerDesigner 掌握Oracle的...
该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...
ThreadLocal 原理 答: 谈谈classloader 答: 答: 动态布局 热修复,插件化 答: HashMap源码,SpareArray原理 性能优化,怎么保证应用启动不卡顿 怎么去除重复代码 答: SP是进程同步的吗?有什么方法做到同步 ...
二、分页插件PageHelper的原理 一次请求就是一个线程,PageHelper.startPage(page,size)中携带分页参数。分页参数会设置在ThreadLocal中。PageHelper会在mybatis执行sql前进行拦截,从ThreadLocal中取出分页参数,...
第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52...
第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52...
2. ThreadLocal辨析 11 3. 线程间的协作 19 4. 面试题 21 第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/...
10.2.1 ThreadLocal的工作原理 375 10.2.2 消息队列的工作原理 380 10.2.3 Looper的工作原理 383 10.2.4 Handler的工作原理 385 10.3 主线程的消息循环 389 第11章 Android的线程和线程池 391 11.1 主线程和子...
10.2.1 ThreadLocal的工作原理 / 375 10.2.2 消息队列的工作原理 / 380 10.2.3 Looper的工作原理 / 383 10.2.4 Handler的工作原理 / 385 10.3 主线程的消息循环 / 389 第11章 Android的线程和线程池 / ...