通过 监听器获取sessionId

 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
原文地址:https://www.cnblogs.com/a757956132/p/4108698.html