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

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

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




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

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


[java]  view plain  copy
  1. "font-size:12px;">public class UserContext implements Serializable{  
  2.   
  3.     private static ThreadLocal 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.在过滤其中进行存放用户登录信息
[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. "font-size:12px;">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. }  

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

你可能感兴趣的:(ThreadLocal取代每次都从session中获取登录用户信息)