1、什麼是會話?
好比一次通話。打開浏覽器,點選多次連結(發出多次請求和收到多次的響應),關閉浏覽器,這個過程就是一次會話。
有功能 可以 檔案 建立會話
2、解決的問題是什麼?
共享多次請求中産生的資料。比如購物車。
0、HTTP協定的消息頭
請求消息頭:Cookie 用戶端向伺服器端傳遞資訊
響應消息頭:Set-Cookie 伺服器端向用戶端傳遞資訊
1、Cookie詳解:
l 屬性:
name:Cookie的名稱,必要的屬性
value:Cookie的取值(不能為中文),必要的屬性
-------------------以下為可選屬性
path:Cookie的路徑
預設值就是寫cookie的那個資源的通路路徑
注意:
如果一個存在浏覽器緩存中的cookie的路徑是/day09/servlet/
當通路http://localhost:8080/day09/CookiePathDemo1時,
浏覽器根本不帶Cookie給伺服器。浏覽器比對的是cookie的路徑和目前通路的資源的路徑。
浏覽器滿足一下條件就會帶cookie給伺服器:
目前通路的位址的路徑.startWith(已存cookie的路徑)。
即:如果一個Cookie的路徑設定為了目前應用,說明通路該網站的任何資源時浏覽器都帶該cookie給伺服器。(開發中經常做的)
maxAge:Cookie的最大生存時間。預設是在浏覽器的記憶體中。
domain:Cookie的域名(網站)。預設就是寫cookie的那個資源所屬的網站。
http://localhost:8080/day09_00_cookie/servlet/CookieDemo1域名就是localhost
version:版本号
comment:注釋
u 把Cookie寫給用戶端:
HttpServletResponse.addCookie(Cookie c):實際上就是向用戶端發送了一個響應消息頭。
注意:用戶端隻能儲存一個網站最多20個Cookie資料,總共最多300個。每個Cookie的大小不能超過4kb。
l 伺服器端擷取用戶端帶來的Cookie:
Cookie [] HttpServletRequest.getCookies();
注意:domain+path+name唯一确定一個Cookie。
2、3個案例
a、顯示使用者最近的通路時間
示範Cookie的path
b、記住登入的使用者名
<code></code>
<code>public class LoginServlet extends HttpServlet {</code>
<code> public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //驗證使用者名和密碼是否正确:此處輸什麼都正确 String username = request.getParameter("username"); String password = request.getParameter("password"); String remember = request.getParameter("remember");//沒有選中就是null Cookie c = new Cookie("loginInfo", username); c.setPath(request.getContextPath()); if(remember==null){ //沒有選中:删cookie c.setMaxAge(0); }else{ //使用者記住使用者名:存cookie c.setMaxAge(Integer.MAX_VALUE); } response.addCookie(c); out.write("登入成功"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }</code>
c.顯示 最近浏覽的産品 (圖書)
1、HttpSession是一個域對象及HttpSession的原理
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
String getId()
HttpSession request.getSession();
HttpSession request.getSession(boolean b):
b如果為true,和getSession()完全一樣的
b為false,伺服器隻是查找,找不到不會建立新的,傳回null。
HttpSession.invalidate();使HttpSession對象立即失效。
a、使用Session完成簡單的購物功能
使用上邊的 book類 和 模拟 bookdb 資料
public class Book implements Serializable
b、完成使用者的登入
c、防止表單的重複送出
3、用戶端禁用Cookie後的會話資料的保持
用戶端永遠不會向伺服器端帶任何cookie。
解決辦法:
方式一:(烏龍)文字提示:請不要禁用您的Cookie
方式二:在通路的位址後面加上JSESSIONID=session的id。
response.encodeUrl(String url);自動重寫。 對購物車案例 修改了
4、HttpSession對象的狀态
很多 銀行的保護性就是将session 減短了。
public class Book implements Serializable 序列化
總結:
一、會話概述
1、如同一次電話通話。
2、會話中要解決的問題:多次請求中的資料的保持問題。典型:購物車
二、Cookie
1、屬性:
name value path maxAge domain version 等
2、HttpServletResponse.addCookie(Cookie c)
3、HttpServletRequest.getCookies()
4、記住使用者名和記住使用者的浏覽記錄
三、HttpSession
1、HttpSession是一個域對象
2、HttpSession的原理(借助Cookie)
3、HttpSession.getSession():先查(按照session對象的ID去查),沒有再建立。
4、案例:
簡單購物車
使用者登入和驗證碼驗證
防止表單的重複送出:從原理上明白
5、用戶端禁用了Cookie後的會話資料保持問題
URL重寫
6、HttpSession對象的狀态變化:鈍化和激活。 向HttpSession中存放的對象的類,要實作java.io.Serializable接口
7、浏覽器何時會開啟一次新的會話。