在講解cookie和session之前,先理解下"狀態管理"的定義:
1、什么是狀態管理?
將瀏覽器與web服務器之間多次交互當做一個整體來看待(即為了完成某個業務,需要多次交互,比如購物),並且將多次交互所涉及的數據(即狀態)保存下來。
2、如何進行狀態管理
客戶端:利用cookie技術進行管理
服務端:利用session技術進行管理
推薦一篇文章,講解了HTML5新特性的localStorage和sessionStorage:https://www.cnblogs.com/st-leslie/p/5617130.html
下面開始進入正題,簡單介紹下java中的cookie和Session:
一、Cookie
1、什么是cookie?
服務器臨時存放在瀏覽器的少量數據
2、cookie的工作原理?
瀏覽器訪問服務器時,服務器將少量數據以set-cookie消息頭的方式發送給瀏覽器;瀏覽器會將這些數據臨時保存下來,當瀏覽器再次訪問服務器時,會將這些數據以cookie消息頭的方式發送給服務器。
3、如何創建一個cookie?
Cookie c = new Cookie(String name,String value); name為cookie的名稱,value為cookie的值
response.addCookie(c); 需要將生成的cookie添加到HttpServletResponse的對象中才能起作用
4、如何獲取Cookie?
Cookie[] arr = request.getCookies(); 當不存在cookie的時候此方法會返回null值
arr[i].getName(); 獲取cookie的名稱
arr[i].getValue(); 獲取cookie的值
5、cookie的生存時間?
默認情況下,瀏覽器會將cookie保存在內存里面,瀏覽器不關閉,cookie一直在),可以調用 cookie.setMaxAge(int seconds)方法來設置cookie的生存時間。
注意:
a.單位是秒
b.當 seconds > 0,瀏覽器會將cookie保存在硬盤上,
超過指定的時間,瀏覽器會銷毀該cookie。
c.當 seconds < 0,保存在內存里面(缺省值)。
d.當 seconds = 0,瀏覽器會立即刪除該cookie。
比如,要刪除一個名稱為"cart"的cookie。
Cookie c = new Cookie("cart","");
c.setMaxAge(0);
response.addCookie(c);
6、cookie的編碼問題?
cookie只能保存合法的ascii字符。中文顯示不屬於ascii字符,需要將中文進行編碼處理(也就是說,將中文轉換成相應的ascii字符串的形式)。
String URLEncoder.encode(String str,String charset)
String URLDecoder.decode(String str,String charset)
注:保存cookie時,盡量都編碼處理。
7、cookie的路徑問題?
a.什么是cookie的路徑問題?
瀏覽器訪問服務器上的某個地址時,會比較該地址是否與cookie的路徑匹配,只有匹配的cookie才會被發送。
匹配規則:要訪問的地址(路徑)必須等於cookie的路徑或者是其子路徑。
b.默認路徑
默認路徑等於添加該cookie的組件的路徑。
比如: /servlet-day07-2/app01/addCookie.jsp添加了一個cookie,則該cookie默認的路徑是"/servlet-day07-2/app01"
c.如何修改cookie的路徑?
cookie.setPath(String path);
8、cookie的缺點?
a. cookie是可以被用戶禁止的。
b. cookie只能保存少量的數據。(大約是4k左右)
c. 瀏覽器通常只允許保存幾百個cookie。
d. cookie不安全。(如果需要將敏感數據,比如帳號密碼以cookie的方式保存在瀏覽器端,一定需要加密)。
二、Session(會話)
1、什么是session?
服務段為保存狀態而創建的一個特殊對象
2、session的工作原理?
瀏覽器訪問服務器時,服務器會創建一個session對象(該對象有一個唯一的id,一般稱之為sessionId),服務器會將這個sessionId以cookie的形式發送給瀏覽器,瀏覽器會保存下來。當瀏覽器再次訪問服務器時,會將sessionId以cookie的形式發發送給服務器,服務器會依據sessionId找到對應的session對象。
3、如何創建一個session對象?
方式一:HttpSession s = request.getSession(boolean flag)
flag==true: 先查看請求當中是否有sessionId,如果沒有,則創建session對象。如果有sessionId,則依據sessionId去查找對應的session對象,找到了,則返回;如果找不到,則創建一個新的session對象。
flag==false:先查看請求當中是否有sessionId,如果沒有,會返回null。如果有sessionId,則依據sessionId去查找對應的session對象,找到了,則返回;如果找不到,返回null。
方式二:HttpSession s = request.getSession(); 和flag==true一致
4、session如何綁定數據?
綁訂數據:setAttribute(String name,Object obj)
依據綁訂名獲得綁訂值:Object getAttribute(String name)
解除綁訂:removeAttribute(String name)
刪除session:session.invalidate()
5、session超時?
1)什么是session超時?
服務器會將空閑時間過長的session對象刪除掉。
注:服務器默認的空閑時間一般是半個小時(可以修改服務器的配置)。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2) setMaxInactiveInterval(int seconds)
6、Session的使用場景?
Session一般使用在用戶登錄時,保存用戶的登錄相關信息,以及項目中進行Session驗證:
step1. 在登錄成功以后,在session對象上綁訂一些數據。比如: session.setAttribute("user",user);
step2. 對於需要登錄之后才能訪問的地址,進行session驗證:
Object obj = session.getAttribute("user");
if(obj == null){
response.sendRedirect("login.jsp");
}
給大家推薦個好點的博客鏈接,里面講述的更完整:https://www.cnblogs.com/shiy/p/6628613.html