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