java中的Cookie和Session


在講解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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM