用ThreadLocal保存当前用户登录状态.在拦截器中获取登录用户的信息,并封装在ThreadLocal中,此后当前线程的调用过程中,都可以非常简单的获取登录用户的信息.
1. 拦截器(SpringMVC)
public class SecurityFilter implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //1) 从cookie中,或者请求的header中,获取有关认证信息 //2) 或者从其他地方获取用户信息,比如DB,cache中等. LoginContext context = new LoginContext(user); LoginContextHolder.set(context); } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { //To change body of implemented methods use File | Settings | File Templates. } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { LoginContextHolder.remove();//清理 } }
2. LoginContext.java
public class LoginContext { private User user; public LoginContext(User user){ this.user = user; } public boolean isLogin(){ return user == null ? false : true; } public User getLoginUser(){ return user; } }
3. LoginContextHolder.java
public class LoginContextHolder { private static final ThreadLocal<LoginContext> holder = new ThreadLocal<LoginContext>(); public static void set(LoginContext context){ if(context != null){ holder.set(context); } } public static LoginContext getContext(){ return holder.get(); } public static void remove(){ holder.remove(); } public static boolean isLogin(){ LoginContext context = getContext(); if(context == null){ return false; } return context.isLogin(); } public static User getLoginUser(){ LoginContext context = getContext(); if(context == null || !context.isLogin()){ return null; } return context.getLoginUser(); } }
相关推荐
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
问题背景在 Tomcat 中,下面的代码都在 webapp 内,会导致 WebappClassLoaderWebappClassLoader 泄漏,无法被回收。
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
Synchronized与ThreadLocal
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化