一个session是何时创建的?
答:当打开一个新的浏览器窗口的时候就会创建一个session。
服务器端是否可以保存所有的session呢?
答:可以的,可以创建一个类(SiteSessionListener,如下所示),实现了HttpSessionListener接口,这样当每一个session创建的时候,就会调用HttpSessionListener接口中的方法sessionCreated,可以在该方法中实现保存该session的操作,将该session保存到类型为Map<String, HttpSession>的sessions变量当中去!
package com.itcast.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SiteSessionListener implements HttpSessionListener {
//这里的sessions应当指的是服务器端保存的,因为客户端的session通常是打开一个浏览器创建的
public static Map<String, HttpSession> sessions = new HashMap<String, HttpSession>();
public void sessionCreated(HttpSessionEvent sessionEvent) {
System.out.println("one session is created,session id is : " + sessionEvent.getSession().getId());
sessions.put(sessionEvent.getSession().getId(), sessionEvent.getSession());
}
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
if(sessions.containsKey(sessionEvent.getSession().getId())){
sessions.remove(sessionEvent.getSession().getId());
}
}
public static HttpSession getSession(String sessionId){
return sessions.get(sessionId);
}
public static void removeSession(String sessionID){
if(sessions.containsKey(sessionID)){
sessions.remove(sessionID);
}
}
}
如何访问到特定的session呢?
因为每一个session在创建的时候,都会有一个sessionID,并且这些信息都是在sessions变量当中储存的,所以就可以根据该sessionID来获得对应的session,例子如下:
package com.itcast.web.action.product.shopping;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.stereotype.Controller;
import com.itcast.util.SiteSessionListener;
@Controller("/shopping/cart")
public class CartAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//通过这两行代码就可以验证当客户端打开两个浏览器页面的时候是否是两个session(通过看两个浏览器页面上显示的代码是否相同)
// if(request.getSession().getAttribute("date") == null){
// request.getSession().setAttribute("date", new Date());
// }
String sid = request.getParameter("sid");
HttpSession session = SiteSessionListener.getSession(sid);
//如果session不存在(即购物车不存在,用户第一次访问),就创建一个session,并存放购物车的信息
if(session == null){
request.getSession().setAttribute("buycart", new Date());
}else{
//如果session存在(即购物车已经存在),就将购物车的信息保存到一个参数当中,为下一个页面显示
request.setAttribute("message", session.getAttribute("buycart"));
}
return mapping.findForward("cart");
}
}
注意:
这里比如说你新打开了一个浏览器窗口,表示为w1,肯定会创建一个session,标识为s1,比如说这个sessionID为C76B7FED6572A1FD88D4371DD1C14DF2
这里比如说你新打开了一个浏览器窗口,表示为w2,肯定会创建一个session,标识为s2,比如说这个sessionID为C4F103D3423A20578C08F3C50EA458DD。
那么在浏览器w2当中,也是可以通过传入
http://localhost:8888/baba1.2/shopping/cart.do?sid=C76B7FED6572A1FD88D4371DD1C14DF2
来获得s1这个session,并获得该session中的一些属性,比如说购物车信息。