用 ThreadLocal 管理用户session

转载 2016年08月28日 22:13:23

很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把保存用户信息的session对象传来传去,

这种情况下,就可以考虑使用 ThreadLocal。

 

ThreadLocal是一个依附于本地线程的变量,按照我的理解,每次对服务器请求,都会使用到一个线程,ThreadLocal的作用就是在这个线程的使用过程中只为这个线程所用。

 

说说具体如何管理用户session。

 

现在SSH框架用的比较多,有时在DAO层中需要用到当前用户信息,我们首先定义保存在HttpSession中的用户类,可以是你的用户model,也可以是嵌套了model的包装类,我这里叫UserSession。

 

在登录方法里将上面定义的用户类对象放入HttpSession中,即: 

  1. session.setAttribute("UserSession", userSession);  

 

写一个用于检验用户的filter,并在web.xml中配置,目的是判断用户有没有登录以及登录用户有没有对要访问链接的权限等,每次请求经过filter时如果HttpSession中的UserSession对象存在的话重新设置一下: 

  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {  
  2.     HttpServletRequest request = (HttpServletRequest)req;  
  3.   
  4.     UserSession userSession = (UserSession)request.getSession().getAttribute("UserSession");  
  5.   
  6.     if (userSession == null) {  
  7.         //跳转登录页面  
  8.         ...  
  9.     } else {  
  10.         request.getSession().setAttribute("UserSession", userSession);  
  11.         filterChain.doFilter(req, res);  
  12.     }  
  13. }  

 

然后创建一个类,用于存放ThreadLocal的静态变量: 

  1. public class SystemSession {  
  2.   
  3.     private static ThreadLocal<UserSession> local = new ThreadLocal<UserSession>();  
  4.   
  5.     public static void setUserSession(UserSession session) {  
  6.         local.set(session);  
  7.     }  
  8.   
  9.     public static UserSession getUserSession() {  
  10.         return local.get();  
  11.     }  
  12. }  
  

 

创建一个监听器,并在web.xml中配置,监听HttpSession的属性变化: 

 

  1. public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {  
  2.     public void attributeAdded(HttpSessionBindingEvent event) {  
  3.         if ("UserSession".equals(event.getName())) {  
  4.             SystemSession.setUserSession((UserSession)event.getValue());  
  5.         }  
  6.     }  
  7.   
  8.     public void attributeReplaced(HttpSessionBindingEvent event) {  
  9.         if ("UserSession".equals(event.getName())) {  
  10.             SystemSession.setUserSession((UserSession)event.getValue());  
  11.         }  
  12.     }  
  13. }  

 

用户在登录后UserSession对象会放入HttpSession中,触发监听器中的attributeAdded方法,于是UserSession对象同时也会放入ThreadLocal中,登录后每次请求会重新设置UserSession对象,触发监听器的attributeReplaced方法,UserSession对象也会放入ThreadLocal中,在程序中用以下语句即可取得UserSession对象: 

  1. SystemSession.getUserSession(); 

利用ThreadLocal管理request和session以及用户信息,实现 Use anywhere

1.我们有时需要获取request或session中的数据的时候,首先需要获取request和session对象,这个通常是在Controller的时候当做入参获取,这样方法的入参会显得很长很臃肿的感...
  • after95
  • after95
  • 2017年10月20日 11:35
  • 183

用 ThreadLocal 管理用户session

新的项目中,画面间和机能间数据传递时,用到了ThreadLocal,先转来一篇,等有时间再整理下 很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把保存用户信息的session...

利用ThreadLocal模式管理Session

利用ThreadLocal模式管理Session          在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Sess...
  • Mr_HHH
  • Mr_HHH
  • 2016年02月17日 16:22
  • 1150

Hibernate用ThreadLocal模式 (线程局部变量模式) 管理Session

(1)使用ThreadLocal模式 (线程局部变量模式) 管理Session的代码如下

ThreadLocal管理和获取Hibernate的Session对象

前几天在csdn论坛里面,经常有人问到,如果不用spring,单用hibernate如何来解决延迟加载的问题. 无论是立即加载还是延迟加载必须要连接数据库的,而在java中连接数据库是依赖jav...
  • he90227
  • he90227
  • 2014年09月11日 13:59
  • 859

ThreadLocal模式下管理的Session会在事务提交后自动关闭!

原文地址:http://www.blogjava.net/savage100/articles/88430.html 最近对Hibernate的ThreadLocal Session模式...

Hibernate——ThreadLocal模式下管理的Session会在事务提交后自动关闭

最近对Hibernate的ThreadLocal Session模式有点兴趣。于是根据曹晓钢翻译的Hibernate Reference做了个小测验,结果发现了一个小bug。 代码很简单,都是利用...

利于ThreadLocal管理Hibernate Session

在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的,以往是通过ecli...

如何在Service层获取用户session中保存的用户信息的方法(Filter+ThreadLocal)

/**  *   * Description: 用ThreadLocal提供一个存储线程内变量的地方.  * 客户端代码可以用静态方法存储和获取线程内变量,不需要依赖于HttpSession.  *...

Session案例之用户登录、会话管理总结

一、Session案例:用户登录 1、需求: 2、功能实现: 1)核心代码: a)LoginServlet:package sram.servlet; import java.io.IOE...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 ThreadLocal 管理用户session
举报原因:
原因补充:

(最多只允许输入30个字)