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