javaweb學習筆記(四):會話管理(1)
目錄
會話管理
1.概念
一次會話: 開啟瀏覽器 -> 訪問一些伺服器內容 -> 關閉瀏覽器。(瀏覽器A給伺服器傳送請求,訪問web程式,該次會話就已經接通,其中不管瀏覽器傳送多少請求,都視為一次會話,直到瀏覽器關閉,本次會話結束。若此時再開啟瀏覽器B,訪問伺服器,這是另一個會話,雖然是在同一臺電腦,同一個使用者在訪問,但是,這是兩次不同的會話。)
http是無狀態的,一次請求結束,連線斷開,下次伺服器再收到請求,它就不知道這個請求是哪個使用者發過來的。當然它知道是哪個客戶端地址發過來的,但是對於我們的應用來說,我們是靠使用者來管理,而不是靠客戶端。所以對我們的應用而言,它是需要有狀態管理的,以便服務端能夠準確的知道http請求是哪個使用者發起的,從而判斷他是否有許可權繼續這個請求。
會話管理: 管理瀏覽器客戶端和伺服器端之間會話過程中產生的會話資料。
兩種會話技術:
①cookie技術:會話資料儲存在瀏覽器客戶端。
②session技術:會話資料儲存在伺服器端。
2.cookie技術
Cookie是客戶端技術,程式把每個使用者的資料以cookie的形式寫給使用者各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的資料去。這樣,web資源處理的就是使用者各自的資料了。
一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。
一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
2.1 Cookie一般處理流程
1.伺服器建立cookie物件,把會話資料儲存到cookie物件中。
Cookie cookie=new Cookie("name","value");
2.伺服器傳送cookie資訊到瀏覽器。
response.addCookie(cookie);
(如: set-cookie: name=eric 隱藏傳送了一個set-cookie名稱的響應頭)
3.瀏覽器得到伺服器傳送的cookie,然後儲存在瀏覽器端。
4.瀏覽器在下次訪問伺服器時,會帶著cookie資訊
(如:cookie: name=eric 隱藏帶著一個叫cookie名稱的請求頭)
5.伺服器接收到瀏覽器帶來的cookie資訊
request.getCookies();
2.2 Cookie類
javax.servlet.http.Cookie類:用於儲存會話資料
1)構造方法:Cookie(java.lang.String name, java.lang.String value)
2)void setValue(java.lang.String newValue) 設定cookie值
java.lang.String getValue() 取得cookie值
3)java.lang.String getName() 取得cookie名字
4)void setMaxAge(int expiry) 設定cookie的有效時間
int getMaxAge() 取得cookie有效期。
其中,expiry為正整數:表示cookie資料儲存瀏覽器的快取目錄(硬碟中),數值表示儲存 的時間。以秒為單位,如24*60*60表示一天。
負整數:表示cookie資料儲存瀏覽器的記憶體中。瀏覽器關閉cookie就丟失了! 即只在一次會話中有效,通常取-1(沒有呼叫本方法,即預設為此)。
零:表示刪除同名的cookie資料。(path必須一致,否則不會刪除)
5)void setPath(java.lang.String uri) 設定cookie的有效訪問路徑
java.lang.String getPath() 取得cookie的有效訪問路徑
有效路徑指的是cookie的有效路徑儲存在哪裡,那麼瀏覽器在有效路徑下訪問伺服器時就會帶著cookie資訊,否則不帶cookie資訊。
例1:驗證Cookie類的常用方法及流程
public class CookieDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1.建立cookie物件
Cookie cookie =new Cookie("name","hua");
//設定cookie有效時間
cookie.setMaxAge(5);
//2.把資料傳送到瀏覽器(通過響應頭髮送:set-cookie)
response.addCookie(cookie);
//3.接收瀏覽器傳送的cookie資訊
//String name=request.getHeader("cookie");
Cookie[] cookies=request.getCookies();
if(cookies!=null) {
for(Cookie c:cookies) {
String name=c.getName();
String value=c.getValue();
System.out.println(name+"="+value);
}
}else {
System.out.println("沒有cookie資料");
}
}
}
例2:使用cookie記錄使用者上次訪問時間
public class HistServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//獲取當前時間
SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String curTime=s.format(new Date());
String lastTime=null;
//取得cookie
Cookie[] cookies=request.getCookies();
//首次訪問
if(cookies==null || lastTime==null) {
response.getWriter().write("你是首次訪問,當前時間 為:"+curTime);
Cookie cookie =new Cookie("lastTime",curTime);
cookie.setMaxAge(1*24*60*60);//儲存一天
response.addCookie(cookie);
}
//已經訪問過至少一次
if(cookies!=null) {
for(Cookie cookie:cookies) {
if(cookie.getName().equals("lastTime")){
lastTime=cookie.getValue();
response.getWriter().write("歡迎回來,上次訪問時間為:"+lastTime+",當前時間為:"+curTime);
cookie.setValue(curTime);
cookie.setMaxAge(1*24*60*60);//儲存一天
response.addCookie(cookie);
break;
}
}
}
}
}
第一次開啟瀏覽器:
稍等一下,再次重新整理: