1 package shopping; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import javax.servlet.http.HttpSession; 7 import javax.servlet.http.HttpSessionEvent; 8 import javax.servlet.http.HttpSessionListener; 9 /** 10 * 通过sessionId获取session 11 * HttpSessionListener:创建一个监听器监听session的创建和摧毁 12 * 13 * 如果用户重新新建了一个浏览器窗口,这样也可以解决了 14 * 15 */ 16 public class SiteSession implements HttpSessionListener { 17 //静态变量能够一直保存 18 /* 19 * String:sessionId 20 * session如果超时不能被垃圾回收器所回收,因为一直被静态变量所引用,将不会被回收 21 * 如果超时希望删除session的话,需要通过静态变量 Map<String,HttpSession> sessions来解决sessionDestroyed方法,以防止内存泄漏 22 */ 23 private static Map<String,HttpSession> sessions = new HashMap<String,HttpSession>(); 24 25 public void sessionCreated(HttpSessionEvent sessionEvent) { 26 sessions.put(sessionEvent.getSession().getId(), sessionEvent.getSession()); 27 } 28 29 public void sessionDestroyed(HttpSessionEvent sessionEvent) { 30 sessions.remove(sessionEvent.getSession().getId()); 31 } 32 33 /** 34 * 只要知道用户的sessionId 就可通过该方法获取原先用户的session 35 * @param sessionID :session的id号 36 * @return 37 */ 38 public static HttpSession getSession(String sessionID){ 39 return sessions.get(sessionID); 40 } 41 42 }
1 <!-- 监听器配置 监听session的创建和关闭--> 2 <listener> 3 <listener-class>shopping.SiteSession</listener-class> 4 </listener>
1 如果acion采用: 2 request.getSession().getAttribute("cart",new Date()); 3 的方式打开两个浏览器窗口的话,将不能获取同一个session对象 4 5 解决办法: 6 String sId = request.getParameter("sessionId"); 7 HttpSession session = SitSessionListener.getSession(sId); 8 if(session == null ){ 9 request.getSession().setAttribute("cart",new Date); 10 }else{ 11 session().getAttribute("message",session.getAttribute("cart")); 12 } 13 就可以解决打开两个窗口但捕获的不是同一个session