一、Session簡介:
Session 和 Cookie 一樣,同樣是在客戶端和服務器之間進行會話時用來傳輸數據的一種方式,不過Cookie數據是保存在客戶端的,而Session數據是存儲在服務器端的,然後服務器會給客戶端返回一個對應Session的ID存儲在客戶端的cookie中,當瀏覽器需要對應的數據時,就可以通過存儲在客戶端的Sessionid去服務器獲取對應的數據。這樣,也就可以解決用Cookie存儲數據的安全性問題。
二、在Session的基本使用方法:
2.1 Session的使用過程:
從服務器獲取一個session,如果能獲取到session,就將Session的id記錄下來,保存在瀏覽器;
如果獲取不到Session,就說明Session還不存在,就創建一個Session,將數據保存在服務器端,將Sessionid保存在客戶端的Cookie中。
獲取Session:
- requset.getSession(); // 直接從服務器獲取Session
- requset.getSession(boolean create) ; // 如果參數爲true, 就直接創建一個session,如果爲false,就相當於上面的方法從服務器獲取一個session
2.2 Session的作用:
作爲域對象使用:
- Session的作用範圍:僅在當前Session域中有效(當前用戶)
2.3 Session的生命週期:
- 創建session:requset.getSession(true);
- 給Session域中添加數據:Session對象 . setAttribute(Stirng s , Object o); // s相當一是一個標識符,o是存入的數據,獲取數據的時候通過這個 字符串s獲取o
- Session的銷燬:
- 服務器非正常關閉的時候,Session被銷燬
- 手動設置Session的最大生存時間:Session對象 . setMaxInactiveInterval(int interval) // 參數是以秒爲單位,一般爲正整數
- 手動刪除Session : invalidate();
2.4 Session的特點:
- 可以存儲任意類型的數據
- 存儲的數據沒有大小限制
- 適合用來存儲私有數據
三、Session的使用案例:
3.1 Session基本使用案例:
後臺往session中寫入數據
前臺jsp頁面輸出獲取到的數據:
運行結果:
3.2 Session案例 — 模擬實現將商品加入購物車
簡單寫幾個商品界面:
product_list.jsp 商品清單的界面,點擊商品之後會跳轉到對應的商品界面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>列表清單</title>
</head>
<body>
<table border="0px" >
<tr>
<td colspan="4">
<img src="../img/頂部.jpg" width="100%" />
</td>
</tr>
<tr>
<td>
<a href="001.jsp">
<img src="../img/001.jpg" />
</a>
</td>
<td>
<a href="002.jsp">
<img src="../img/002.jpg" />
</a>
</td>
<td>
<a href="003.jsp">
<img src="../img/003.jpg" />
</a>
</td>
<td>
<a href="004.jsp">
<img src="../img/004.jpg" />
</a>
</td>
</tr>
</table>
<hr/>
<a href="showCart.jsp">查看購物車</a>
</body>
</html>
001.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>watch</title>
</head>
<body>
<center>
<img src="../img/001.jpg" width="200" height="200"/>
</center>
<center>
價格:888
<a href="">立即購買</a>
<a href='/add2Cart?name="手錶"'>加入購物車</a>
<a href="showCart.jsp">查看購物車</a>
<a href="product_list.jsp">回到主頁</a>
</center>
</body>
</html>
002.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>watch</title>
</head>
<body>
<center>
<img src="../img/002.jpg" width="200" height="200"/>
</center>
<center>
價格:666
<a href="">立即購買</a>
<a href='/add2Cart?name="洗面奶"'>加入購物車</a>
<a href="showCart.jsp">查看購物車</a>
<a href="product_list.jsp">回到主頁</a>
</center>
</body>
</html>
幾個商品界面基本一樣,這裏就放兩個商品的代碼了。
查看購物車的頁面:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
Created by IntelliJ IDEA.
User: ASUS
Date: 2019/6/1
Time: 16:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>show</title>
</head>
<body>
<table border="1px" cellpadding="0px" cellspacing="0px" align="center" >
<tr bgcolor="#ffe4c4">
<th width="100px">商品名稱</th>
<th width="100px">商品數量</th>
</tr>
<c:choose>
<c:when test="${empty sessionScope.cart}">
<tr>
<td colspan="2">
購物車空空如也~~~
</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${cart}" var="item">
<tr bgcolor="gray">
<td >
<c:out value="${item.key}"/>
</td>
<td>
<c:out value=" ${[item.value]}"/>
</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</body>
</html>
後臺獲取信息並處理數據的Servlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Add2Cart extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 當用戶點擊加入購物車的時候 在後臺獲取點擊的商品對應的id
String name = request.getParameter("name");
// 獲取名字爲cart的session數據
HttpSession session = request.getSession();
Map<String, Long> cartMap = (Map<String, Long>) session.getAttribute("cart");
// 如果爲空,表示還沒有創建購物車的Session
if (cartMap == null)
{
Map<String, Long> cart = new HashMap();
cart.put(name, 1L);
session.setAttribute("cart", cart);
}
// 如果不爲空,說明已經創建過session了,現在需要在獲取到的購物車中判斷是否包含現在訪問的
// 名稱的商品,如果有當前商品,讓商品的個數加一,如果沒有當前商品,就放入當前商品,數量爲1
else
{
if (cartMap.keySet().contains(name))
{
cartMap.put(name, cartMap.get(name)+1);
}
else
{
cartMap.put(name, 1L);
}
// 吧數據更新後的購物車存入session中
session.setAttribute("cart", cartMap);
}
// 設置最大生存時間,單位爲秒
session.setMaxInactiveInterval(1200);
response.getWriter().write(name+"添加到購物車成功<hr/>");
// if (cartMap != null)
// System.out.println(cartMap.get(name));
response.getWriter().write("<a href='history/product_list.jsp'>回到首頁</a>");
}
}
運行結果:
查看購物車的信息: