`
liulanghan110
  • 浏览: 1077827 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

用 ThreadLocal 管理用户session

    博客分类:
  • JAVA
阅读更多

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

 

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

 

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

 

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

 

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

 

 

session.setAttribute("UserSession", userSession);

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

 

public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)req;

    UserSession userSession = (UserSession)request.getSession().getAttribute("UserSession");

    if (userSession == null) {
        //跳转登录页面
        ...
    } else {
        request.getSession().setAttribute("UserSession", userSession);
        filterChain.doFilter(req, res);
    }
}

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

public class SystemSession {

    private static ThreadLocal<UserSession> local = new ThreadLocal<UserSession>();

    public static void setUserSession(UserSession session) {
        local.set(session);
    }

    public static UserSession getUserSession() {
        return local.get();
    }
}

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

public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent event) {
        if ("UserSession".equals(event.getName())) {
            SystemSession.setUserSession((UserSession)event.getValue());
        }
    }

    public void attributeReplaced(HttpSessionBindingEvent event) {
        if ("UserSession".equals(event.getName())) {
            SystemSession.setUserSession((UserSession)event.getValue());
        }
    }
}

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

SystemSession.getUserSession();  

 

分享到:
评论

相关推荐

    使用ThreadLocal管理“session”数据

    2. **为什么使用ThreadLocal管理Session?** 在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储...

    ThreadLocal的几种误区

    1. 存储当前会话用户信息:例如,可以在一个线程中使用ThreadLocal保存用户的登录状态,确保每个线程只处理一个用户的信息。 2. 存放上下文变量:如WebWork的ActionContext,它可以保存请求处理过程中的各种上下文...

    通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分

    此外,ThreadLocal还有其他应用场景,比如在Web开发中,可以用来存储请求相关的上下文信息,如用户会话、线程安全的计数器等,避免在多线程环境中的数据污染问题。 总之,ThreadLocal是Java多线程编程中的一种有效...

    ThreadLocal原理及在多层架构中的应用.pdf

    因此,ThreadLocal非常适合在多层架构中管理数据库连接、用户认证信息等需要线程安全但又不宜在多线程间共享的资源。 数据库连接是一个经典的例子。在没有使用连接池的原始JDBC方式中,每次通过DriverManager.get...

    Java源码解析ThreadLocal及使用场景

    ThreadLocal的使用方式非常灵活,可以用来解决各种问题,例如在Web开发中,可以使用ThreadLocal来存储用户的Session信息,在分布式系统中,可以使用ThreadLocal来存储事务id等。 ThreadLocal的实现原理是基于...

    java 中ThreadLocal 的正确用法

    * Hibernate 的 Session 管理 * 日志记录的线程关联 * 等等 ThreadLocal 的注意事项 在使用 ThreadLocal 时,我们需要注意以下几点: * ThreadLocal 变量应该是 private static 的,以避免外部访问和修改。 * 在...

    day36 11-Hibernate中的事务:当前线程中的session

    使用ThreadLocal Session的一个关键好处是事务的自动管理。当开启一个新的Session时,Hibernate会隐式地开始一个事务;当Session关闭时,如果之前没有遇到异常,那么事务就会被提交;如果有异常,事务会被回滚,从而...

    java 中ThreadLocal实例分析

    例如,在 Web 应用程序中,我们可以使用 ThreadLocal 来存储用户的 Session 信息,以便在多个请求之间共享 Session 信息。 ThreadLocal 是 Java 中的一种强大且灵活的机制,用于实现线程安全和变量隔离。它可以帮助...

    课程hibernate的事务和并发.pdf

    实现“session-per-request”模式需要拦截器,通常使用ServletFilter或ThreadLocal来管理Session。ThreadLocal变量可以绑定到处理请求的线程,使得代码能方便地访问Session,而事务上下文环境也可存储在ThreadLocal...

    struts2+hibernate3 open session in view

    为了优化,可以考虑在某些不需要访问数据库的Action中禁用OSIV,或者使用更精细粒度的Session管理,只在真正需要的时候打开和关闭。 总的来说,"Struts2+Hibernate3 Open Session in View"项目展示了如何结合这两种...

    hibernate的事务和并发资料.pdf

    为了实现这一模式,推荐使用拦截器(如ServletFilter)结合ThreadLocal来管理Session和事务,这样可以在处理请求的线程中方便地访问和管理Session。 此外,Hibernate还提供了辅助API来支持行级悲观锁定,利用`...

    java 中ThreadLocal本地线程和同步机制的比较

    1. 存放Session用户:每个线程可以有自己的Session副本,避免了在多线程环境下对同一个Session对象的并发访问。 2. 存放上下文变量:如WebWork的ActionContext,可以在线程内存储请求相关的上下文信息。 3. 在Spring...

    oracle常用命令

    - 使用`SessionFactory`对象来创建和管理`Session`,`SessionFactory`是线程安全的,一般在应用初始化时创建一次。 2. **线程与Session绑定**: - `ThreadLocal`是Java中的一个类,用于为每个线程维护一个独立的...

    WEB应用数据权限控制.pdf

    WEB应用数据权限控制是企业信息系统中非常重要的一环,它确保了...此外,对于文档中出现的技术细节,如Session的ThreadLocal管理、SQL语句的构造等,都需要在实际编码时细心设计和实施,以保证数据的正确性和安全性。

    hibernate的事务核并发

    在多线程环境中,如Web应用或EJB容器,为了保证`Session`的线程安全和资源的有效利用,可以使用`ThreadLocal`变量来存储当前线程的`Session`实例。然而,在CMT环境中,由于单个session bean可能会被多个线程并行调用...

    STRUTS+Hibernatre+Spring 组学习资料整理.docx

    7. 处理并发和线程安全问题,例如使用ThreadLocal进行Session管理。 通过这些知识点的学习和实践,你将能够熟练地构建和维护基于Struts、Hibernate和Spring的复杂Java Web应用程序。同时,理解这三者之间的协作机制...

    Web服务器的工作原理

    在Web应用中,Cookie经常与Session一起使用,通过在客户端存储Session标识符来简化会话管理。 ### 确保线程安全 #### 七、线程安全 在Servlet环境中,确保线程安全是非常重要的,因为多个请求可能会并发访问相同的...

    JSP写的BBS系统

    例如,使用ThreadLocal管理数据库连接,避免并发问题;通过连接池提高数据库访问效率。 8. **页面导航与URL设计** 为了提供良好的用户体验,BBS系统的URL应该清晰、易于理解。可以使用URL重写技术,使URL更具描述...

    我的一个小例子

    例如,UserManager类可能会使用HashMap或ArrayList来存储用户数据,使用PreparedStatement来防止SQL注入,以及使用ThreadLocal来管理数据库连接。 在实际项目中,用户管理系统可能还会涉及到其他技术,如JDBC(Java...

Global site tag (gtag.js) - Google Analytics