session
web中每次登录或退出,session是怎么处理的?
一、首先,写一个监听器,监听用户请求和session的操作动作
1 public class AppRequestListener implements ServletRequestListener, 2 HttpSessionAttributeListener { 3 4 private final Log log = LogFactory.getLog(AppRequestListener.class); 5 6 @Override 7 public void attributeAdded(HttpSessionBindingEvent event) {//在session中添加对象时触发 8 dealSessionErr(event, "add"); 9 10 } 11 12 @Override 13 public void attributeRemoved(HttpSessionBindingEvent event) {//移除session时触发 14 dealSessionErr(event, "remove"); 15 16 } 17 18 @Override 19 public void attributeReplaced(HttpSessionBindingEvent event) {//替换session中对象时触发 20 dealSessionErr(event, "replace"); 21 22 } 23 24 @Override 25 public void requestDestroyed(ServletRequestEvent event) {//用户请求结束时,触发该方法 26 CtxSessionBag.clear(); 27 28 } 29 30 @Override 31 public void requestInitialized(ServletRequestEvent requestEvent) {//用户请求到达初始化时,触发该方法 32 HttpServletRequest request = (HttpServletRequest) requestEvent 33 .getServletRequest(); 34 String pin = LoginUtils.getPin(request); 35 try { 36 request.setCharacterEncoding("UTF-8"); 37 } catch (UnsupportedEncodingException e) { 38 e.printStackTrace(); 39 } 40 SessionBagImpl sessionBag = null; 41 if (pin == null) { 42 return; 43 } 44 45 if (sessionBag == null) { 46 sessionBag = new SessionBagImpl(); 47 } 48 49 sessionBag.setIp(request.getRemoteAddr()); 50 sessionBag.setSessionNbr(request.getSession().getId()); 51 52 BackOperator bo = sessionBag.getBackOperator(); 53 if (bo == null) { 54 bo = new BackOperator(); 55 } 56 bo.setUserName(pin); 57 sessionBag.setBackOperator(bo); 58 CtxSessionBag.setSessionBag(sessionBag); 59 60 } 61 62 }
二、在web.xml中添加监听器
<listener>
<listener-class>com.***.web.listener.AppRequestListener</listener-class>
</listener>
三、AppRequestListener 是监听器,每次请求的时候或session操作的时候,都会执行,所以在这个类里,
requestInitialized方法里,每次用户请求时,把用户信息封装到CtxSessionBag里
1 public class CtxSessionBag { 2 private static final ThreadLocal<SessionBagImpl> sessionBagThread = new ThreadLocal<SessionBagImpl>(); 3 4 public static SessionBagImpl getSessionBag() { 5 return sessionBagThread.get(); 6 } 7 8 public static void setSessionBag(SessionBagImpl s){ 9 sessionBagThread.set(s); 10 } 11 12 public static void clear(){ 13 sessionBagThread.set(null); 14 } 15 }
CtxSessionBag 把session信息存到ThreadLocal里,可以共享,每次从CtxSessionBag 类静态方法取