用 ThreadLocal 管理用户session

很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把保存用户信息的session对象传来传去,这种情况下,就可以考虑使用 ThreadLocal。

 

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

 

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

 

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

 

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

[java]  view plain copy
  1. session.setAttribute("UserSession", userSession);  

 

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

[java]  view plain copy
  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的静态变量: 

[java]  view plain copy
  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的属性变化: 

 

[java]  view plain copy
  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对象: 

[java]  view plain copy
  1. SystemSession.getUserSession();  

源: http://blog.csdn.net/nan_jiang_/article/details/5055221
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值