用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(); } }
相关推荐
// 添加以下代码来清除 ThreadLocal 中的引用 myThreadLocal.remove(); } ``` 通过添加 `myThreadLocal.remove()`,我们可以确保在每次请求结束后,`ThreadLocal` 不再持有对 `MyCounter` 的引用,从而避免了内存...
**线程局部变量(ThreadLocal)是Java编程中一个...了解并熟练掌握ThreadLocal可以帮助我们编写出更高效、更安全的多线程代码。在Java并发编程中,ThreadLocal是一个不可或缺的工具,尤其在需要线程私有数据的场景下。
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
ThreadLocal的一个经典应用场景是在数据库连接池中,每个线程都可以有自己的数据库连接,而无需在多个线程间共享,这样可以简化代码并提高性能。另外,它也可以用于HTTP请求上下文,存储请求相关的数据,如用户会话...
ThreadLocal虽然能提供方便的线程隔离,但过度依赖ThreadLocal可能导致代码可复用性和可测试性降低。因为ThreadLocal使得原本可以独立运行的类变得依赖于线程环境,这限制了它们在没有ThreadLocal场景下的应用。因此...
在提供的"ThreadLocal示例"压缩包中,可能包含了一些具体的代码示例,展示如何在实际项目中运用ThreadLocal。通过查看这些示例,你可以更深入地理解ThreadLocal的工作方式以及如何在你的代码中有效地利用它。
`ThreadLocal`是一种强大的工具,它简化了多线程编程中对线程局部数据的管理,提高了代码的可读性和可维护性。然而,不当的使用也可能导致内存泄漏和其他潜在问题。因此,在使用`ThreadLocal`时,应当充分理解其工作...
Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。...理解并熟练运用这两个概念,对于编写高效、安全的并发代码至关重要。
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。...在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一种有效手段。
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的概念,主要用于在多线程环境中为每个线程提供独立的变量...在多层架构中,ThreadLocal可以有效地提高代码的可读性和性能,但也需要谨慎使用,遵循最佳实践。
通过为每个线程创建独立的变量副本,它不仅简化了代码,还提高了程序的可维护性和安全性。需要注意的是,尽管使用了弱引用来避免内存泄漏,但仍需谨慎管理`ThreadLocal`实例的生命周期,确保及时释放不再使用的资源...
ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...
由于提供的文件内容包含了大量的OCR扫描错误和重复内容,我将尽力根据现有的信息,提供一个关于ThreadLocal的知识点总结。如果出现无法理解的片段,我会尝试根据上下文进行合理推断并忽略错误的部分。 在Java中,...
- **代码可读性和可维护性**:`ThreadLocal`的使用可能使代码变得复杂,不易于理解和调试,尤其是在多线程环境下的问题排查。 总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多...
总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高代码的可复用性和安全性。通过使用ThreadLocal,我们可以创建线程安全的变量,使得每个线程都能...
通常,`TestClinet.java`可能是一个测试客户端代码,用来演示如何使用ThreadLocal。`SequenceNumber.java`可能是实现一个线程安全的序列号生成器,利用ThreadLocal为每个线程维护一个独立的序列号计数器,以避免并发...
**线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己...