用 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保存用户登录信息

最近在使用WebSocket来进行消息推送,也k
  • hzw2312
  • hzw2312
  • 2014年11月18日 19:37
  • 7453

ThreadLocal管理下的Session

ThreadLocal并不是名字直接释义的线程本地实现版本,其实它是一个线程中的局部变量。 它的功能非常简单,就是为使用某一变量的线程提供一个该变量的副本,使其可以对该副本进行操作,而不会影响到其...
  • liuxins
  • liuxins
  • 2016年04月04日 13:50
  • 1291

利用ThreadLocal模式管理Session

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

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

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

ThreadLocal管理和获取Hibernate的Session对象

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

用 ThreadLocal 管理用户session

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

jsp servlet Session管理(ThreadLocal)

在各种Session 管理方案中, ThreadLocal 模式得到了大量使用。ThreadLocal 是 Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程...
  • undeadwing
  • undeadwing
  • 2013年07月24日 16:35
  • 1165

ThreadLocal管理mybatis中的sqlSession

转载自:  http://blog.csdn.net/qq_29227939/article/details/52029065 最近在使用Mybatis中,发现需要像.NET EF那样管理宝贵的...
  • wwe4023
  • wwe4023
  • 2017年06月18日 13:43
  • 315

使用ThreadLocal来存储Session,以便实现Session any where

早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...
  • cbjcry
  • cbjcry
  • 2017年04月13日 10:13
  • 525

Session管理之ThreadLocal

在各种Session 管理方案中, ThreadLocal 模式得到了大量使用。ThreadLocal 是 Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2014年07月25日 16:08
  • 927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 ThreadLocal 管理用户session
举报原因:
原因补充:

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