在一次http会话中,线程内变量的存储依赖于HttpSession,而实际应用中有很多地方是无法取到HttpSession的,那么怎么样才能灵活的获取线程内变量?其实很简单只需要定义静态的变量,并在动作执行前进入将线程变量保存到静态变量中即可,那么在本次HTTP会话中需要用到线程变量的地方只需要调用静态变量并获取对应的值就可以了
以下是存储和获取线程内变量的类源码UserSession,可以保存线程内的相关变量,例如用户的名,昵称等相关的信息
public class UserSession {
//线程变量,注意new的一定是个Hashtable而不是HashMap
private static final ThreadLocal<Map> sessionMap = new ThreadLocal<Map>(){
protected Map initialValue() {return new Hashtable();}
};
/**
* 取得属性
* @param attribute
* @return
*/
public static Object get(String attribute) {
Map map = sessionMap.get();
return map.get(attribute);
}
/**
* 取得属性
* @param <T>
* @param attribute
* @param clazz
* @return
*/
public static <T> T get(String attribute, Class<T> clazz) {
return (T) get(attribute);
}
/**
* 设置属性
* @param attribute
* @param value
*/
public static void set(String attribute, Object value) {
Map map = sessionMap.get();
map.put(attribute, value);
}
}
以上只是提供了一个类去保存变量,在HTTP会话中,我们应该是动作开始前去注入变量并保存,这里就要用到filter,在web.xml中添加一个filter
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>com.jteap.core.web.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
在定义的OpenSessionInViewFilter中我们重写方法doFilterInternal()
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//设置当前用户到线程变量
setLocalVar((HttpServletRequest)request,(HttpServletResponse)response);
super.doFilterInternal(request, response, filterChain);
}
/**
* 设置本地线程变量
* @param request
* @param response
*/
private void setLocalVar(HttpServletRequest request, HttpServletResponse response){
UserSession.set(Constants.THREADLOCAL_CURRENT_SESSION, request.getSession());
}
以上在动作前就设置好了相关线程变量,那么在http后任何需要变量的地方只需要UserSession.get(attribute)就可以获取对应变量的值了
例如在aop编程中完成日志的记录功能,在用户进行动作完成后使用AOP编程来进入对应的方法,这里需要用户的相关信息可是却无法获取HTTPSESSION了,这时候UserSession的作用就体现出来了。
分享到:
相关推荐
ThreadLocal则为每一个线程提供了一个变量副本,从而隔离了多个线程访问数据的冲突,ThreadLocal提供了线程安全的对象封装,下面我们就来详细了解一下吧
在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程...
为每个线程保存一个副本 类似于一个以线程id为key的map 不可变对象状态 final 关键共享资源上互斥,变并发为串行即同步 锁 分类 显示锁 Lock Lock是个接口 实现类 ReentrantLock 可重入锁 ...
Java语言规范中指出:为了获得佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时,必须要注意到要让线程...
每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
其中使用一个ALL_BUFFER结构的全局变量来连接两个进程,使用关键代码段来保持这两个进程的互斥。 ALL_BUFFER结构中有100个指向char的指针,当然这个100可以更改。 当接受到图片后,把当前图片保存在的buffer复制到...
栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。每个C ++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在...
注意:不应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。 pthread_create函数 创建一个新线程。 其作用,对应进程中fork() 函数。 int pthread_create...
java 学习整理文档 Spring框架并...使用ThreadLocal ,在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(以空间换时间”),为每一个线程都提供了一份变量,因此可以同时访问而互不影响
比如已知用户指定了n(它是一个int型变量)个线程吧,可以用如下方法开启五个线程 Thread[] downloadThread;//声名下载线程,这是C#的优势,即数组初始化时,不需要指定其长度,可以在使用时才指定。这个声名应为类...
本节向你展示如何在任务中发送数据给UI线程里的对象,这...在创建线程池的类的构造器里实例化Handler对象,保存在全局变量里。用Handler(Looper)方法实例化,连接到UI线程,构造方法使用Looper对象,也是Android系统线
为实现多用户聊天,采用了服务器端分发线程处理,主线程阻塞接受客户端socket, 每接收一个socket连接就分发一个线程处理,通过全局变量保存所有客户socket 连接,在每个处理线程中通过客户socket 连接池中每个客户...
清理一下”大家通常性的做法,这里清理的都是指运行在系统中的进程,如开发的打开浏览器,每新打开一个窗口都是一个新的进程,打开一个网站,会加载js、下载图片、请求数据、保存信息各式各样的操作,那么线程是什么...
如果你要反复执行一个任务,用不同的数据集(参数不同),但一次只要一个执行(任务是单线程的),...能被多线程访问的变量需要同步块.更多信息,见Processes and Threads(http://developer.android.com/guide/component
域counterValue 用来保存计数器的当前数值 方法increment(), 计数器加一 方法decrement(), 计数器减一 方法reset(), 计数器清零 3.编程实现矩形类,其中包括计算矩形周长和面积的方法。 4.使用矩形类,编程...
1.JVM为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧 2.每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量池组成 3.每个线程获得一个程序计数器,用于记录当前虚拟机正在执行的线程指令地址 4.系统...
变量保存在由所有线程共享的主内存中,主内存中的变量称为mastingcopy。每个线程都有一个工作内存,它保存变量的workingcopy。旧的内存模型定义了若干规则,通过这些规则来保证线程何时将主内存中的mastingcopy传送...
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1) 并行设备的硬件寄存器(如:状态寄存器) 2) 一个中断服务子程序...
- 打开与保存文件 - Qt下正确显示中文字符 - 模式与非模式对话框 - 以父窗口成员变量形式实现非模式对话框 `dlg->show()` - 仅在使用时才实例化对象实现模式对话框 `dlg.exec()` - 定义对话框类的...