JavaEE_day35:Servlet-cookie-session
http協議的特點:稱之為無狀態
, 請求與請求之間不會記錄狀態(狀態就包括請求引數等資訊)
1. Cookie
本意是小甜點, 可以用來記錄多個請求之間的聯絡,儲存伺服器的狀態
實現一個記住使用者名稱的功能
1.1 建立Cookie
Cookie c = new Cookie("名字", "值"); // 建立cookie c.setMaxAge(整數); // 設定cookie的壽命,單位是秒,沒有設定壽命的是會話cookie瀏覽器關閉就刪除 c.setMaxAge(0); // 設定壽命為0,意味著刪除此cookie response.addCookie(c); // 通過響應物件,把建立的cookie返回給瀏覽器
瀏覽器每次傳送請求時,就會根據域名進行檢查,把該域名下的所有cookie發給伺服器
1.2 獲取cookie
Cookie[] cookies = request.getCookies(); // 獲取請求中所有的cookie
1.3 中文問題
URLEncoder.encode(中文, "utf-8"); // 將編碼後的中文存入cookie的值 URLDecoder.decode("編碼後的內容", "utf-8"); // 把編碼後的內容進行解碼
1.4 el表示式獲取cookie值
el的語法: ${cookie.cookie的名稱.value}
1.5 cookie的限制
瀏覽器每個域名下能夠包含30~50個cookie 每個cookie的長度大約是4k左右
2.session 會話
session也是用來儲存多次請求之間的狀態資訊,session是把這些資訊存在伺服器的內容當中
2.1 session建立
HttpSession session = request.getSession(); // 首次呼叫getSession方法就是建立session物件 // 後續再呼叫getSession方法是獲取第一次建立好的session物件
存入內容 session.setAttribute("變數名", 任意資訊); 獲取內容 Obejct 資訊 = session.getAttribute("變數名"); 刪除內容 Obejct 資訊 = session.removeAttribute("變數名"); 讓session失效(會清空session中所有內容) session.invalidate();
2.2 典型應用-使用者登入
使用者登陸介面:
16行
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ankouchen</title>
</head>
<body>
<form action="/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
伺服器獲取引數,如果獲取的使用者名稱和密碼和管理員username和密碼一致,則跳轉到歡迎介面,否則又回到登陸介面:
27行
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// 1獲取請求引數
Object username = req.getParameter("username");
Object password = req.getParameter("password");
// 2驗證使用者名稱和密碼
if ("zhangsan".equals(username) && "1234".equals(password)) {
// 3. 獲取session物件
HttpSession session = req.getSession();
// 4. 儲存登入標記
session.setAttribute("isLogin", true);
session.setAttribute("username", username);
// 5. 跳轉到歡迎頁面
req.getRequestDispatcher("welcome.jsp").forward(req, resp);
} else {
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
歡迎介面:
10行
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ankouchen</title>
</head>
<body>
歡迎來到王者榮耀!
</body>
</html>
新增產品介面:
16行
@WebServlet(urlPatterns = "/productAdd")
public class ProductAdd extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取LoginServlet物件裡邊的Session物件的值
HttpSession session = req.getSession();
if(session.getAttribute("isLogin")==null){
req.getRequestDispatcher("login.jsp").forward(req, resp);
return;
}
System.out.println("新增商品成功!");
}
}
刪除商品介面:
13行
@WebServlet(urlPatterns = "/productDelete")
public class ProductDelete extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
if(session.getAttribute("isLogin")==null){
req.getRequestDispatcher("login.jsp").forward(req, resp);
return;
}
System.out.println("刪除商品成功!");
}
}
2.3 典型應用-使用者登出(安全退出)
2.4 jsp頁面獲取session中的變數
${sessionScope.變數名}
2.5 session實現的原理
session 必須針對同一個瀏覽器,才能實現在請求儲存資訊,在之後的請求獲取資訊的效果
每個使用者訪問伺服器時,伺服器會為他們建立一個獨立的session
- 首次建立session時,tomcat會產生一個名為
JSESSIONID=session的唯一標識
的特殊cookie 這個JSESSIONID=1
就會隨著響應返回給瀏覽器 - 瀏覽器會記錄這個cookie。之後的所有請求會把此cookie傳送給伺服器。 伺服器根據cookie的值找到對應的session
- jsessionid 這個cookie屬於會話cookie,瀏覽器關閉就會消失
對比session和cookie
- session是將資訊儲存於伺服器端,cookie是將資訊儲存於瀏覽器端
- session與cookie相比,更為安全
- session的生命週期相對較短, 兩次請求間隔超過30分鐘,伺服器會銷燬session 呼叫session.invalidate方法時,會立刻銷燬 cookie 會話cookie是瀏覽器關閉就銷燬 setMaxAge的cookie會根據設定的壽命存活一段時間
- 儲存的資訊量上 cookie 每個最大大小是4k左右 session 理論上沒有限制,但session要佔用伺服器記憶體,所以不太適合儲存太多的內容 資訊要永久儲存,還是需要使用資料庫
- cookie裡資料都得是字串,而session裡可以儲存任意型別
3. 重定向請求
請求轉發: request.getRequestDispatcher("目錄路徑").forward(request,response);
請求重定向: response.sendRedirect("目錄路徑");
區別: 1) 請求轉發時,位址列不會改變(是第一個servlet的地址) 重定向,位址列會發生變化(是最後一個servlet的地址) 2) 請求轉發時一次請求,跳轉發生在伺服器內部 重定向是兩次請求,第一次請求會返回302的狀態碼和目標地址, 瀏覽器根據目標地址傳送第二次請求,才完成整個流程 3) 重定向是兩次請求,所以不能利用request作用域存值取值 但可以使用session作用域來存值取值 請求轉發因為是同一次請求,所以可以使用request作用域存值取值 4) 請求轉發的目標只能是本專案的servlet或jsp 重定向跳轉的目標可以是任意的
查詢 servlet --> jsp // 關係密切的跳轉使用請求轉發 forward() 刪除 刪除servlet --> 查詢列表servlet // 關係不密切的跳轉使用重定向 redirect()