一、概念
1. Session: 将会话中产生的数据保存在服务端 ; 是服务端技术 ;
2. 具体流程
1)浏览器第一次发送请求需要保存数据时,服务端获取到需要保存的数据, 去服务器内部检查一下有没有为当前浏览器服务的session ; 如果有就直接拿过来用, 如果没有session就创建一个新的session拿过来用 ;
2)当浏览器再去访问服务器时, 服务器可以从session中获取到之前为当前浏览器保存的数据, 通过这种方式, 也可以来保存会话中产生的数据,服务器做出响应:将session 的id通过Cookie发送给浏览器; 如下:
具体如下图: 客户端再次请求服务器时,会把session的id带给服务器 ,服务端根据session的id到服务器中取出该session 。
3. Session域对象
作用访问:整个会话范围
setAttribute(); getAttribute(); removeAttribute(); getAttributeNames(); |
4. 生命周期
1)创建: 当第一次调用request.getSession(),创建session对象
request.getSession(); request.getSession(true); 在调用上述方法时, 如果服务器内部有为当前客户端服务的session, 就直接拿过来使用, 如果没有对应的session, 就创建一个新的session拿过来用.
request.getSession(false); 在调用该方法时, 如果服务器内部有为当前浏览器服务的session就直接拿过来使用,;如果没有对应的session, 就返回null. |
2)销毁
a. 超时销毁
如果session 30分钟没有被使用,(例如登陆后,30分钟未操作,会通知重新登陆) 则会超时销毁. 可以在web应用的web.xml文件中修改session的超时时间.
<!-- 配置session的超时时间(默认30分钟)(这里设1分钟) --> <session-config> <session-timeout>1</session-timeout> </session-config> |
b. 自杀
当调用session.invalidate方法时,将会立即销毁session
Request.getSession().invalidate(); |
c. 意外身亡(session的钝化)
当服务器非正常关闭时, session会销毁! 如果服务器正常关闭, session将会以文件的形式保存在服务器的work目录下;
session的活化: 当服务器再次启动时,钝化着的session还可以再恢复回来
5. 具体案例
1) 将商品加入购物车
protected void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
// 处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
// 1.获取请求中包含的商品信息(prod)
String prod = request.getParameter("prod");
prod = new String(prod.getBytes("iso8859-1"),"utf-8");
// 2.获取一个Session对象
HttpSession session = request.getSession();
// 创建一个Cookie
// 名字:JSESSIONID, 值:session.getId();
Cookie cookie = new Cookie("JSESSIONID", session.getId());
// 设置Cookie的path为: /day16/
cookie.setPath(request.getContextPath()+ "/");
// 设置Cookie的MaxAge: 30分钟
cookie.setMaxAge(1800);
// 将Cookie添加到response中发送给浏览器
response.addCookie(cookie);
// 3.将商品信息加入购物车(保存进session中)
session.setAttribute("prod", prod);
// 4.做出响应
response.getWriter().write("成功将[ "+ prod + " ]商品加入了购物车!");
}
2)为购物车中的商品进行结算
protected void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
// 处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
// 1.获取(之前的)Session对象
HttpSession session = request.getSession();
// 2.从session中取出要结算的商品
String prod = (String) session.getAttribute("prod");
// 3.为商品进行结算
response.getWriter().write("成功为[ "+ prod + " ]商品支付了10000元!");
}
6.优化 服务器返回cookie携带session的id 的方案:
在创建session后, 服务器会向浏览器发送Cookie来保存session的id, 我们也可以向浏览器发送Cookie,
也保存session的id, 区别是我们发送的Cookie, 可以设置最大生存时间,