Cookie概述及示例

------------------------------------Cookie概述及示例-------------------------------------------

  1. Cookie概述

 

  • 什麼叫Cookie

Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookie就是一個鍵和一個值構成的,隨着服務器端的響應發送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。

 

  • 2 Cookie規範

你大可以放心,Cookie不會佔滿你的硬盤。因爲一個Cookie最多隻有4KB,並且瀏覽器最多可以保存300個Cookie。當然,在瀏覽器大戰的今天,一些瀏覽器爲了打敗對手,可能對Cookie規範“擴展”了一些,例如每個Cookie的大小爲8KB,最多可保存500個Cookie等!但也不會出現把你硬盤佔滿的可能!

不同的瀏覽器之間不能共享Cookie!!!

 

  • 3 Cookie的作用

Cookie的作用可大了,但無論怎麼誇大Cookie的作用都離不開“跟蹤客戶端狀態”這句話。我們知道Cookie是服務器保存在客戶端的信息,然後客戶端會在下次請求時把Cookie在還給服務器,這樣服務器就可以通過信息來識別客戶端了。

代碼示例:

public class RegistServlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              request.setCharacterEncoding("UTF-8");

              //獲取用戶名和密碼

              String username = request.getParameter("username");

              String password = request.getParameter("password");

             

              System.out.println("用戶名:"+username);

              System.out.println("密碼:"+password);

              //將用戶和密碼賦給regist屬性

              request.setAttribute("username",username);

              request.setAttribute("passward",password);

              //如果跳轉到regist1.html頁面,這時當前servlet的request作用就消失了

              //如果跳轉到的是servlet,那麼當前servlet的request域作用繼續存在

              request.getRequestDispatcher("/regist1.html").forward(request, response);

       }

}

 

public class Regist1Servlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              //獲得性別

              String gender = request.getParameter("gender");

              //獲得職位

              String job = request.getParameter("job");

              //獲得用戶和密碼

              String username = (String)request.getAttribute("username");

              String password = (String)request.getAttribute("password");

             

              switch(gender){

                     case "1" :

                            gender="男";

                            break;

                     case "2" :

                            gender="女";

                            break;

              }

             

              switch(job){

                     case "1" :

                            job="講師";

                            break;

                     case "2" :

                            job="構架師";

                            break;

              }

              //設置response的類型和編碼

              response.setCharacterEncoding("UTF-8");

              response.setContentType("text/html;charset=UTF-8");

              //打印到頁面上

              response.getWriter().println("<h1>註冊成功</h1>");

              response.getWriter().println("<hr>");

              response.getWriter().println("用戶名:"+username+"<br>");

              response.getWriter().println("密碼:"+password+"<br>");

              response.getWriter().println("性別:"+gender+"<br>");

              response.getWriter().println("職位:"+job+"<br>");

              //因爲當前servlet中的request是新的對象,所以是獲取不到上一個servlet的request屬性

              //那麼用戶名和密碼打印爲null

             

       }

 

}

 

 

2 Cookie的示例

  • 保存Cookie到客戶端

這是響應工作的一部分,所以這個方法是response對象的。並且Cookie是HTTP協議中的內容,所以保存Cookie是HttpServletResponse類的方法。

void addCookie(Cookie c):添加Cookie對象到當前response對象中,這個方法可以被調用多次,從而完成添加多個Cookie對象到response中。

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request,

           HttpServletResponse response)

           throws ServletException, IOException {

       Cookie c = new Cookie("name", "renliang");

       response.addCookie(c);

    }

}

 

  使用瀏覽器訪問http://localhost/day06_03/AServlet,然後通過HttpWatch查看響應頭信息中是否存在Set-Cookie這個頭信息。

  當再交方法http://localhost/day07_03/AServlet時,查看請求頭信息中是否存在Cookie這個頭信息。當然也可以嘗試訪問http://localhost/day07_03/BServlet是否在請求頭中存在Cookie這個頭信息。

 

嘗試訪問http://localhost/day07_03/BServlet,你可能會說,BServlet不存在,沒錯,BServlet是不存在,但我們只關心請求,而不關心響應。我們只需要看看在請求中是否存在Cookie這個頭信息。你應該已經嘗試過了,也看到了Cookie請求頭信息。這說明不只是訪問AServlet纔會有Cookie請求頭信息,而是隻要訪問這個day07_03就會有Cookie這個請求頭。

Cookie的大小是有限的,瀏覽器最多可以保存300個Cookie,一個Cookie最多隻有4KB,如果超出最大容量就會報如下錯誤。

 

 

 

  • 服務器端讀取Cookie

我們現在已經可以保存Cookie到客戶端了,但還沒有學習讓服務器如何讀取Cookie。

如果瀏覽器保存了Cookie,那麼會在下一次請求時把Cookie放到請求頭中發送給服務器,這時服務器需要在請求中讀取Cookie。既然是在請求中讀取,那麼當然是使用request對象來讀取了。

HttpServletRequest:Cookie[] getCookies()

注意,它返回的是Cookie數組,而不是一個Cookie對象。如果請求中沒有Cookie,那麼該方法返回null。

       Cookie[] cs = request.getCookies();

       if (cs != null) {

           for (Cookie c : cs) {

              String str = c.getName() + ": " + c.getValue() + "<br/>";

              response.getWriter().print(str);

           }

       }

 

Cookie存寫代碼示例:

RegistServlet存儲cookie

public class RegistServlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              request.setCharacterEncoding("UTF-8");

              //獲取用戶名和密碼

              String username = request.getParameter("username");

              String password = request.getParameter("password");

             

              System.out.println("用戶名:"+username);

              System.out.println("密碼:"+password);

             

              //創建cookie對象,將用戶名和密碼連接存儲,使用逗號分開

              Cookie cookie = new Cookie("userpass", username+","+password);

             

              //把cookie寫入瀏覽器

              response.addCookie(cookie);

             

              //跳轉頁面

              request.getRequestDispatcher("/regist1.html").forward(request, response);

       }

 

}

RegistServlet1讀取cookie

public class Regist1Servlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              //獲得性別

              String gender = request.getParameter("gender");

              //獲得職位

              String job = request.getParameter("job");

             

              //從瀏覽器中來讀取當前項目的所有cookie

              Cookie[] cookies = request.getCookies();

              String userpassVal = null;

              //遍歷cookies

              for (Cookie cookie : cookies) {

                     //獲取cookie的name

                     String cookieName = cookie.getName();

                     if("userpass".equals(cookieName)){

                            //獲得cookie的值

                            userpassVal = cookie.getValue();

                     }

              }

             

              String username = null;

              String password = null;

              if(userpassVal != null){

                     //將用戶密碼字符串進行分割

                     String[] upValues = userpassVal.split(",");

                     //將分割後的字符串數組賦給相對應的用戶和密碼

                     username = upValues[0];

                     password = upValues[1];

              }

             

              switch(gender){

                     case "1" :

                            gender="男";

                            break;

                     case "2" :

                            gender="女";

                            break;

              }

             

              switch(job){

                     case "1" :

                            job="講師";

                            break;

                     case "2" :

                            job="構架師";

                            break;

              }

              //設置response的類型和編碼

              response.setCharacterEncoding("UTF-8");

              response.setContentType("text/html;charset=UTF-8");

              //打印到頁面上

              response.getWriter().println("<h1>註冊成功</h1>");

              response.getWriter().println("<hr>");

              response.getWriter().println("用戶名:"+username+"<br>");

              response.getWriter().println("密碼:"+password+"<br>");

              response.getWriter().println("性別:"+gender+"<br>");

              response.getWriter().println("職位:"+job+"<br>");

       }

}

 

360瀏覽器查看存儲的cookie:

 

發佈了205 篇原創文章 · 獲贊 125 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章