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空閒時間。