1、cookie技術
a, cookie是什麼?
瀏覽器訪問服務器時,服務器發送給瀏覽器
少量的數據,這些數據以set-cookie消息頭的
方式發送給瀏覽器。瀏覽器會將set-cookie消
息頭設置的內容保存下來(內存或者是硬盤)。
當瀏覽器再次訪問服務器時,會將之前保存的數
據以cookie消息頭的方式發送給服務器,通過這
種機制,可以將瀏覽器與服務器之間交互的數據
保存下來。
b, 創建cookie
Cookie cookie = new Cookie(String name,
String value);
cookie.setMaxAge(int seconds);
response.addCookie(cookie);
c,查詢cookie
//如果沒有cookie,會返回null
Cookie[] request.getCookies();
String cookie.getName();
String cookie.getValue();
d,編碼問題
cookie的值只能是ascii字符,如果出現了非
ascii字符(比如中文),需要將中文轉換成
對應的ascii字符表示。
可以使用URLEncoder.encode方法或者
BASE64Encoder.encode方法來實現轉換。
要注意:
在查詢時,要使用對應的方法來解碼。
e, 生存時間
cookie.setMaxAge(int seconds)
單位是秒。
seconds <0: 保存在內存里(默認值),只有
當瀏覽器關閉,cookie才會刪除。
seconds > 0: 以文件的方式保存在硬盤上,
超過這個時間,瀏覽器會刪除cookie。
seconds = 0: 立即刪除cookie。
如果要刪除一個名叫”username”的cookie:
Cookie cookie = new Cookie(“username”,””);
cookie.setMaxAge(0);
response.addCookie(cookie);
f, 路徑問題
瀏覽器在訪問服務器的某個路徑時,會
先比較cookie的路徑與服務器的路徑,只有
符合條件的cookie才會發送給服務器。
cookie如果沒有調用setPath方法,則會
有一個默認的路徑,這個默認的路徑是
創建該cookie的組件的路徑。
比如: /web06_3/jsp01/addCookie.jsp
創建了某個cookie,則該cookie的路徑是:
/web06_3/jsp01
瀏覽器會比較cookie的路徑與要訪問的組件
的路徑,只有當要訪問的組件的路徑是cookie
的路徑或者及子路徑時,瀏覽器才會發送該
cookie組服務器。
//設置cookie的路徑
cookie.setPath(String str);
比如:
cookie.setPath(“/web06_3″);這樣設置的
作用是,該組件生成的cookie,可以被這個應用
下所有的其它組件訪問到。
練習:
寫一個Find_AddCookieServlet,該servlet
先查詢有沒有一個名叫 userProfile的cookie,如果有,則
顯示該cookie的值,如果沒有,則創建該cookie。
new Cookie(“userProfile”,”abc”)
g, cookie的限制
cookie可以被禁止。
cookie的大小有限制(大約4k左右,跟
瀏覽器有關係),數量也有限制,瀏覽器
在本地大約能保存300個左右的cookie。
cookie不安全
cookie的值只能是字符串
2、session技術
(1)什麼是session?
瀏覽器訪問服務器時,服務器會創建一個
對象(該對象稱為session對象,該對象有一個唯一
的id號,稱為sessionId),服務器在默認情況下,
會將這個sessionId以set-cookie消息頭的方式
發送給瀏覽器(即使用cookie機制),瀏覽器會將
sessionId保存到內存里。當瀏覽器再次訪問服務
器時,會將sessionId發送給服務器。服務器依據
sessionId就可以找到之前創建的session對象。
(2) 如何獲得一個session對象?
a, HttpSession session =
request.getSession(boolean flag);
當flag為true:
服務器會檢查請求中是否包含sessionId,
如果沒有,服務器會創建一個session對象;
如果有,服務器依據sessionId去查找session
對象,如果找到了,則返回,找不到,創建
一個新的session對象。
當flag為false:
服務器會檢查請求中是否包含sessionId,
如果沒有,返回null;
如果有,服務器依據sessionId去查找session
對象,如果找到了,則返回,找不到,返回
null。
b,HttpSession session =
request.getSession();
該方法完全等價與request.getSession(true)。
(3) session的常用方法:
String session.getId(); //返回sessionId。
session.setAttribute(String name,
Object obj);
//name對應的值不存在,返回null。
Object session.getAttribute(String name);
session.removeAttribute(String name);
(4)session的超時
服務器會將空閑時間過長的session對象
刪除掉,稱之為session超時。
服務器會有一個缺省的超時限制(一般是
30分鐘),這個缺省時間可以修改。
比如tomcat可以修改 conf/web.xml
30
該修改會影響到所有部署在這個服務器上的
應用,一般不要修改。
可以對某個應用,在web.xml文件中,添加
30
可以調用session.setMaxInactiveInterval(int
seconds)設置超時限制。
(5) session的刪除
session.invalidate();
案例:
session驗證
step1 在登錄成功之後,向session對象里
綁訂數據:
session.setAttribute(“user”,user);
step2 對於需要保護的資源(即必須要登錄之
後才能訪問的資源),添加驗證代碼:
Object obj = session.getAttribute(“user”);
if(obj == null){
//沒有登錄
response.sendRedirect(“login.jsp”);
}else{
//正常訪問
}