在会话过程中,保存会话数据有两种方式:session和cookie,这两种方式存在的场合不一样。
session主要保存在服务器端,从会话建立直到消亡,而cookie存在于客户端浏览器,当然也可通过服务器的某些方法获得。
这样在解决共享session时,对于session与浏览器的对应存在着一对多的联系,此时我们需要了解到对于动态网站这样的开发,通常服务器会把session的唯一标识通过cookie的 形式写回到浏览器在用户第一次建立连接时,如果浏览器禁用cookie就在url地址后面加上session标识。
因而,问题就变成如何将sessionid写回到多个浏览器或多个连接地址后面。
此类方式对解决实现记录用户操作非常有用。
下面是购买过程的servlet实现:
//1.得到用户想买的书
String id = request.getParameter("id");
Book book = (Book) DB.getMap().get(id);
//2.把用户购买的书加在session中用于管理所有书的集合了
HttpSession session = request.getSession();
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30*60);
cookie.setPath("/day06");
response.addCookie(cookie);
List<Book> list = (List<Book>) session.getAttribute("list");
if(list==null){
list = new ArrayList<Book>();
session.setAttribute("list", list);
}
list.add(book);
//3.跳转到购物车显示列表
String url = response.encodeRedirectUrl("/day06/servlet/ListCartServlet");
//request.getRequestDispatcher("/servlet/ListCartServlet").forward(request, response);
//response.sendRedirect("/day06/servlet/ListCartServlet");没禁用cookie时采用的方法
response.sendRedirect(url);
这样不管用户是否禁用cookie都可以实现共享session