package shopping;

 import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 通過sessionId獲取session
* HttpSessionListener:建立一個監聽器監聽session的建立和摧毀
*
* 如果使用者重新新建了一個瀏覽器視窗,這樣也可以解決了
*
*/
public class SiteSession implements HttpSessionListener {
//靜態變數能夠一直儲存
/*
* String:sessionId
* session如果超時不能被垃圾回收器所回收,因為一直被靜態變數所引用,將不會被回收
* 如果超時希望刪除session的話,需要通過靜態變數 Map<String,HttpSession> sessions來解決sessionDestroyed方法,以防止記憶體洩漏
*/
private static Map<String,HttpSession> sessions = new HashMap<String,HttpSession>(); public void sessionCreated(HttpSessionEvent sessionEvent) {
sessions.put(sessionEvent.getSession().getId(), sessionEvent.getSession());
} public void sessionDestroyed(HttpSessionEvent sessionEvent) {
sessions.remove(sessionEvent.getSession().getId());
} /**
* 只要知道使用者的sessionId 就可通過該方法獲取原先使用者的session
* @param sessionID :session的id號
* @return
*/
public static HttpSession getSession(String sessionID){
return sessions.get(sessionID);
} }
  <!-- 監聽器配置  監聽session的建立和關閉-->
<listener>
<listener-class>shopping.SiteSession</listener-class>
</listener>
 如果acion採用:
request.getSession().getAttribute("cart",new Date());
的方式開啟兩個瀏覽器視窗的話,將不能獲取同一個session物件 解決辦法:
String sId = request.getParameter("sessionId");
HttpSession session = SitSessionListener.getSession(sId);
if(session == null ){
request.getSession().setAttribute("cart",new Date);
}else{
session().getAttribute("message",session.getAttribute("cart"));
}
就可以解決開啟兩個視窗但捕獲的不是同一個session