ThreadLocal取代每次都从session中获取登录用户信息

ThreadLocal取代每次都从session中获取登录用户信息

2017年06月12日 10:28:37
  • 2048




方式一:直接使用JDK中ThreadLocal方式

1.先定义一个存放登录用户信息的实体类,并在这里面操纵用户信息

 
  
[java]  view plain  copy
  1. <span style="font-size:12px;"><strong>public class UserContext implements Serializable{  
  2.   
  3.     private static ThreadLocal<LoginEntity> loginEntityThreadLocal=new ThreadLocal<>();  
  4.   
  5.     public static LoginEntity getUserSession() {  
  6.         return loginEntityThreadLocal.get();  
  7.     }  
  8.   
  9.     public static void setUserSession(LoginEntity entity) {  
  10.         loginEntityThreadLocal.set(entity);  
  11.     }  
  12.   
  13.     public static void removeUserSession() {  
  14.         loginEntityThreadLocal.remove();  
  15.     }  
  16. }</strong></span>  
2.在过滤其中进行存放用户登录信息
[java]  view plain  copy
  1. public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,  
  2.             ServletException {  
  3.         HttpServletRequest request = (HttpServletRequest) req;  
  4.         HttpServletResponse response = (HttpServletResponse) resp;  
  5.         HttpSession session = request.getSession();  
  6.           
  7.         request.setCharacterEncoding("UTF-8");  
  8.         response.setCharacterEncoding("UTF-8");  
  9.           
  10.         response.addHeader("Access-Control-Allow-Origin","*");  
  11.         response.addHeader("Access-Control-Allow-Credentials""true");  
  12.         response.addHeader("Access-Control-Allow-Headers""Origin, X-Requested-With, Content-Type, Accept,X-Pagination");  
  13.         response.addHeader("Access-Control-Allow-Methods""GET, POST, PUT, DELETE, OPTIONS");  
  14.         response.addHeader("Access-Control-Expose-Headers""X-Pagination");  
  15.           
  16.         //System.out.println(session.getId());  
  17.         if (isInclude(request.getServletPath())) {  
  18.             LoginEntity loginEntity = (LoginEntity) session.getAttribute(Const.LOGINED_KEY);  
  19.             if (loginEntity != null) {  
  20.                 UserContext.setUserSession(loginEntity);  
  21.                 chain.doFilter(request, response);  
  22.             } else {  
  23.                 unLogin(response);  
  24.             }  
  25.         } else {  
  26.             chain.doFilter(request, response);  
  27.         }  
  28.     }  

方式二:RequestContextHolder是Spring中对ThreadLocal进行了封装

1.先定义一个存放登录用户信息的实体类,并在这里面操纵用户信息

[java]  view plain  copy
  1. <span style="font-size:12px;"><strong>public class UserContext implements Serializable{  
  2.       
  3.     /** 
  4.      * 获取当前线程绑定的用户登录对象 
  5.      * 
  6.      * @return 
  7.      */  
  8.     public static LoginEntity getUserSession() {  
  9.         return (LoginEntity) RequestContextHolder.getRequestAttributes().getAttribute(Constant.LOGINED_KEY,  RequestAttributes.SCOPE_REQUEST);  
  10.     }  
  11.   
  12.     /** 
  13.      * 将用户登录对象绑定到当前线程 
  14.      * 
  15.      * @param loginEntity 
  16.      */  
  17.     public static void setUserSession(LoginEntity loginEntity) {  
  18.         RequestContextHolder.getRequestAttributes().setAttribute(Constant.LOGINED_KEY, loginEntity, RequestAttributes.SCOPE_REQUEST);  
  19.     }  
  20.   
  21.     /** 
  22.      * 将用户登录对象从当前线程销毁 
  23.      */  
  24.     public static void removeUserSession() {  
  25.         RequestContextHolder.getRequestAttributes().removeAttribute(Constant.LOGINED_KEY,RequestAttributes.SCOPE_REQUEST);  
  26.     }  
  27.   
  28. }</strong></span>  

2.在过滤其中进行存放用户登录信息
[java]  view plain  copy
  1. public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,  
  2.             ServletException {  
  3.         HttpServletRequest request = (HttpServletRequest) req;  
  4.         HttpServletResponse response = (HttpServletResponse) resp;  
  5.         HttpSession session = request.getSession();  
  6.           
  7.         request.setCharacterEncoding("UTF-8");  
  8.         response.setCharacterEncoding("UTF-8");  
  9.           
  10.         response.addHeader("Access-Control-Allow-Origin","*");  
  11.         response.addHeader("Access-Control-Allow-Credentials""true");  
  12.         response.addHeader("Access-Control-Allow-Headers""Origin, X-Requested-With, Content-Type, Accept,X-Pagination");  
  13.         response.addHeader("Access-Control-Allow-Methods""GET, POST, PUT, DELETE, OPTIONS");  
  14.         response.addHeader("Access-Control-Expose-Headers""X-Pagination");  
  15.           
  16.         //System.out.println(session.getId());  
  17.         if (isInclude(request.getServletPath())) {  
  18.             LoginEntity loginEntity = (LoginEntity) session.getAttribute(Const.LOGINED_KEY);  
  19.             if (loginEntity != null) {  
  20.                 UserContext.setUserSession(loginEntity);  
  21.                 chain.doFilter(request, response);  
  22.             } else {  
  23.                 unLogin(response);  
  24.             }  
  25.         } else {  
  26.             chain.doFilter(request, response);  
  27.         }  
  28.     }  


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanlzhl/article/details/73088026
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocalJava的一个类,可以在多线程环境下为每个线程提供独立的变量副本。通过使用ThreadLocal,我们可以在拦截器解析token获取到用户的信息,并将用户信息存入ThreadLocal对象,以便在整个请求的生命周期内随时获取到当前线程的用户信息。 具体实现步骤如下: 1. 首先,编写一个ThreadLocal工具类,例如UserUtils,该类包含一个私有的ThreadLocal对象,用于存储用户信息。该类提供了set、get和remove方法,分别用于将用户信息放入ThreadLocal获取当前线程用户信息和删除当前线程用户信息。 2. 在拦截器,解析token获取到用户的信息,并调用UserUtils的set方法将用户信息放入ThreadLocal。 3. 在需要获取用户信息的地方,调用UserUtils的get方法即可获取当前线程用户信息。 4. 在请求结束后,需要调用UserUtils的remove方法删除当前线程用户信息,以防止内存泄漏。 示例代码如下: ```java // UserUtils.java public class UserUtils { private static final ThreadLocal<User> LOCAL = new ThreadLocal<>(); private UserUtils() {} public static void set(User user) { LOCAL.set(user); } public static User get() { return LOCAL.get(); } public static void remove() { LOCAL.remove(); } } // 拦截器的代码 public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 解析token获取用户信息 User user = parseToken(request); // 将用户信息放入ThreadLocal UserUtils.set(user); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求结束后,删除ThreadLocal用户信息 UserUtils.remove(); } } // 在需要获取用户信息的地方 User user = UserUtils.get(); ``` 通过以上步骤,我们可以在拦截器解析token获取到用户的信息,并将用户信息存入ThreadLocal对象。在整个请求的生命周期内,我们可以随时通过UserUtils.get()方法获取到当前线程用户信息。 #### 引用[.reference_title] - *1* *2* [ThreadLocal获取用户信息](https://blog.csdn.net/qq_38737586/article/details/118661699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ThreadLocal实现登录(保存用户登录信息)](https://blog.csdn.net/qq_56851614/article/details/125464270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值