ThreadLocal取代每次都從session中獲取登錄用戶信息


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

1.先定義一個存放登錄用戶信息的實體類,並在這里面操縱用戶信息

 

 
          
 
  1. 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. }
2.在過濾其中進行存放用戶登錄信息
 
          

 
  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.先定義一個存放登錄用戶信息的實體類,並在這里面操縱用戶信息

 


 
  1. 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.在過濾其中進行存放用戶登錄信息
 
          

 
  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM