Session的工作原理
总结:
(1)session是将会话产生的数据保存在服务端,属于服务端技术
(2)session是一个域对象,session保存了一个map集合,往session存数据本质上就是把数据保存的map集合上
(3)通过session.setAttribute方法将数据保存到session的map集合中,通过session.getAttribute将数据从map集合中取出来
Session作为域对象
Session是一个域对象,因此session中也提供了存取数据的方法。
session.setAttribute(String attrName, Object attrValue);
//往session域中添加一个域属性, 属性名只能是字符串, 属性值可以是任意类型
session.getAttribute(String attrName);
//根据属性名获取session域中的属性值, 返回值是一个Object类型
如何获取session对象:
HttpSession session = request.getSession(); // 获取一个session对象, 如果在服务器内部有当前浏览器对应的session对象,则直接返回该session对象; 如果在服务器内部没有对应session, 则会创建一个新的session对象再返回。
Session域对象的三大特征:
(1)生命周期:
创建session: 在第一次调用request.getSession()方法时, 会创建一个session对象(当客户端在服务器端没有对应的session时, 调用request.getSession方法会让创建一个session对象并返回)
销毁session:
a)超时销毁: 默认情况下, 当超过30分钟没有访问session, session就会超时销毁(30分钟是默认时间,可以修改,但不推荐修改)
b)自杀: 调用session的invalidate方法, 会立即销毁session
c)意外身亡: 当服务器非正常关闭时(断电/硬件损坏/内存溢出等导致服务器意外关闭), session会随着服务器的关闭而销毁;
当服务器正常关闭, 在关闭之前, 服务器会将内部的session对象序列化保存到服务器的work目录下, 变为一个文件, 这个过程叫做session的序列化(也叫做钝化)。再次启动服务器, 钝化着的session会再次回到服务器,变为服务器中的session对象,这个过程叫做session的反序列化(活化)
(2)作用范围:(同一个客户端)在一次会话中,获取到的都是同一个session对象
(3)主要功能:在一次会话范围内实现数据的共享
案例:实现购物车
1.index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品列表</title>
</head>
<body>
<h3>点击下面的商品链接, 可以将商品加入购物车</h3>
<!--
http://localhost/13-cookie/index.html
http://localhost/13-cookie/CartServlet
-->
<p><a href="CartServlet?prod=iphone11">iphone11</a></p>
<p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>
<p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>
<p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>
<h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>
<!-- http://localhost/13-cookie/PayServlet -->
<a href="PayServlet">支付</a>
</body>
</html>
2.CartServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//处理响应中文乱码
response.setContentType("text/html;charset=utf-8");
//获取一个response输出流
PrintWriter out = response.getWriter();
//=================================
//1.获取要加入购物车的商品信息
String prodName = request.getParameter( "prod" );
//2.获取一个session对象,将商品信息保存到session中
HttpSession session = request.getSession();
session.setAttribute( "cart", prodName );
//3.做出响应
out.write( "成功将 [ "+prodName+" ] 加入了购物车~~~" );
}
3.PayServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//处理响应中文乱码
response.setContentType("text/html;charset=utf-8");
//获取一个response输出流
PrintWriter out = response.getWriter();
//==================================
//1.获取一个session对象(之前的session)
HttpSession session = request.getSession();
//2.从session中获取到要结算的商品信息
String prodName = (String)session.getAttribute( "cart" );
//3.对商品进行结算,做出响应
out.write( "成功为 [ "+prodName+" ] 支付了2000.0~~~" );
}