HttpSession:会话作用域对象。用于解决cookie存储类型单一,存储数量少的问题。
java代码
//web.xml
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.luna.controller.OneServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.luna.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
首先是购物页面…
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎选购</title>
</head>
<body >
<h2 style="color: red;" align="center">欢迎选购</h2>
<table align="center" border="1px">
<tr>
<td>商品名称</td>
<td>商品单价</td>
<td>供货商</td>
<td>操作</td>
</tr>
<tr>
<td>华为magic笔记本</td>
<td>7000</td>
<td>华为</td>
<td><a href="/myweb/one?goodsName=华为magic笔记本">加入购物车</a></td>
</tr>
<tr>
<td>榴莲</td>
<td>200</td>
<td>泰国</td>
<td><a href="/myweb/one?goodsName=榴莲">加入购物车</a></td>
</tr>
<tr>
<td>男士小袜</td>
<td>50</td>
<td>杭州</td>
<td><a href="/myweb/one?goodsName=男士小袜">加入购物车</a></td>
</tr>
<tr align="center">
<td colspan="4">
<a href="/myweb/two">查看我的购物车</a>
</td>
</tr>
</table>
</body>
</html>
当用户在购物页面index.html点击加入购物车时,商品参数会通过超链接发送给OneServlet,OneServlet通过request拿到商品参数并为用户建立session,通过goodsName的真实值确定商品数量,当前购物车此商品==null则令其为数量1,当前购物车此商品!=null则令其数量+1
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、调用请求对象获取请求头参数,得到用户选择的商品名
String goodsName=request.getParameter("goodsName");
//2、调用请求对象,向Tomcat索要当前用户在服务端的私人储物柜
HttpSession session=request.getSession();
//3、将用户选购商品添加到当前用户私人储物柜
Integer goodsNum=(Integer) session.getAttribute(goodsName);
if (goodsNum==null){
session.setAttribute(goodsName,1);
}else{
session.setAttribute(goodsName,goodsNum+1);
}
}
}
当用户点击购物页面的"查看购物车"时,浏览器将通过超链接发送到TwoServlet。TwoServlet通过request拿到session,对其中元素进行遍历并输出。
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、调用请求对象,向Tomcat索要当前用户在服务端私人储物柜
HttpSession session=request.getSession();
//2、将session中的所有key读取出来,存放在一个枚举对象中
Enumeration goodsNames=session.getAttributeNames();
while(goodsNames.hasMoreElements()){
String goodsName=(String) goodsNames.nextElement();
int goodsNum=(int) session.getAttribute(goodsName);
System.out.println("商品名称:"+goodsName+" 商品数量:"+goodsNum);
}
}
}
面试题:
1、cookie与session的区别
1)存储位置:Cookie存储在客户端计算机(浏览器内存/硬盘);HttpSession存放在服务端计算机内存。
2)数据类型:Cookie存储的数据类型只能是String;HttpSession可存储任意类型(Object)。
3)数据数量:一个Cookie只能存储一个共享数据;HttpSession可存储任意数量。
4 )参照物:Cookie相当于客户在服务端的会员卡;HttpSession相当于客户在服务端的私人保险柜。
2、Http服务器如何将用户与HttpSession关联起来?
通过Cookie。
Tomcat在创建一个HttpSession对象时自动为这个HttpSession对象生成一个编号(箱号)。Tomcat将箱号保存到cookie对象中,推送到当前浏览器缓存。格式为cookie:JSESSIONID=箱号
等到用户第二次访问,Tomcat根据请求头JSESSIONID确认用户是否有HttpSession以及哪一个HttpSession是当前用户。
流程图如下:
3、getSession()与getSession(false)的区别
1 )getSession():查看当前请求对象是否有session,如果有则返回session对象,如果没有就创建一个。
2 )getSession(false):查看当前请求对象是否有session,如果有则返回session对象,如果没有就返回null。
4、HttpSession的销毁时机
1)cookie是用户与session的关联,浏览器关闭则cookie销毁,也就是用户与session的关联断开。但Tomcat无法检测浏览器是否关闭,因此浏览器关闭时session并不会销毁。
2)为了解决这个问题,Tomcat为session对象设置了空闲时间,默认为30分钟,超过30分钟session将被销毁。另外,可以在web.xml文件中自定义session空闲时间。