JSP Cookies處理


在本章中,我們將討論JSP中的Cookie處理。 Cookie是儲存在用戶端計算機上的文字檔案,它們用於各種資訊的跟蹤。JSP透明地支援使用底層servlet技術的HTTP Cookie。

識別和返回使用者資訊有三個步驟 -

  • 伺服器指令碼將一組Cookie傳送到瀏覽器。例如姓名,年齡或身份證號等
  • 瀏覽器將此資訊儲存在本地機器上以備將來使用。
  • 當下一次瀏覽器向Web伺服器傳送任何請求時,瀏覽器將這些cookie資訊傳送到伺服器,伺服器使用該資訊來識別使用者,或者也可以用於其他目的。

本章將介紹如何設定或重置Cookie,如何存取它們以及如何使用JSP程式來刪除它們。

Cookie剖析

Cookie通常設定在HTTP檔頭中(儘管JavaScript也可以直接在瀏覽器上設定cookie)。設定cookie的JSP響應頭傳送看起來類似這樣 -

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
   path = /; domain = tw511.com
Connection: close
Content-Type: text/html

可以看到,Set-Cookie頭包含nameGMTpathdomain的鍵值對。名稱和值將被URL編碼。 expires欄位是指定的時間和日期之後瀏覽器刪除cookie的指令。

如果瀏覽器組態為儲存cookie,那麼它將保留此資訊直到指定期日。如果使用者將瀏覽器指向與Cookie的路徑和域匹配的任何頁面,則它將重新傳送到伺服器的cookie。瀏覽器的請求檔頭看起來像這樣 -

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126

Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz

然後,JSP指令碼將通過請求方法request.getCookies()存取Cookie,該方法返回一個Cookie物件陣列。

Servlet Cookie方法

下表列出了與Cookie物件相關聯的有用方法,我們可以在JSP中操作Cookie時呼叫它們。

編號 方法 描述
1 public void setDomain(String pattern) 此方法設定適用Cookie的域; 例如,tw511.com
2 public String getDomain() 此方法獲取適用Cookie的域; 例如,tw511.com
3 public void setMaxAge(int expiry) 此方法設定在cookie過期之前經過多少時間(以秒為單位)。如果沒有設定此項,cookie將僅持續到當前對談結束。
4 public int getMaxAge() 此方法返回cookie的最大時間,以秒為單位指定。預設情況下,-1表示cookie將持續到瀏覽器關閉。
5 public String getName() 此方法返回cookie的名稱。建立後不能更改名稱。
6 public void setValue(String newValue) 此方法設定與Cookie關聯的值。
7 public String getValue() 該方法獲取與cookie相關聯的值。
8 public void setPath(String uri) 此方法設定此cookie適用的路徑。如果不指定路徑,則將返回與當前頁面以及所有子目錄位於同一目錄中的所有URL的Cookie。
9 public String getPath() 此方法獲取此cookie應用的路徑。
10 public void setSecure(boolean flag) 此方法設定布林值,指示Cookie是否應僅通過加密(即SSL)連線傳送。
11 public void setComment(String purpose) 此方法指定描述Cookie目的的注釋。 如果瀏覽器向使用者顯示cookie,則該注釋很有用。
12 public String getComment() 此方法返回描述此cookie目的的注釋,如果cookie沒有注釋,則返回null

使用JSP設定Cookies

使用JSP設定cookie包括三個步驟 -

步驟1:建立一個Cookie物件

指定Cookie名稱和Cookie值呼叫Cookie建構函式,這兩者都是字串。參考以下程式碼 -

Cookie cookie = new Cookie("key","value");

請記住,名稱和值都不應包含空格或任何以下字元 -

[ ] ( ) = , " / ? @ : ;

步驟2:設定最大有效時間

可以使用setMaxAge指定cookie應該有效的時間(以秒為單位)。以下程式碼將設定一個24小時有效時間的cookie。

Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);

步驟3:將Cookie傳送到HTTP響應頭

使用response.addCookie在HTTP響應檔頭中新增Cookie,如下所示 -

Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24); 
response.addCookie(cookie);

JSP操作Cookies範例

開啟Eclipse,建立一個動態Web專案:CookiesHandling,其結構如下所示 -

假設要實現將使用者提交上來的使用者名和Email設定到cookie中,並返回到用戶端瀏覽器。請參考以下程式碼 -

檔案:setCookies.jsp -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>接收表單並設定Cookies</title>
</head>
<body>
    <%
        // Create cookies for first and last names.      
        Cookie cookie1 = new Cookie("username", request.getParameter("username"));
        Cookie cookie2 = new Cookie("email", request.getParameter("email"));

        // Set expiry date after 24 Hrs for both the cookies.
        cookie1.setMaxAge(60 * 60 * 24);
        cookie2.setMaxAge(60 * 60 * 24);

        // Add both the cookies in the response header.
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    %>
    <div style="margin: auto; width: 80%;">
        <center>
            <h2>設定Cookies</h2>
        </center>
        <ul>
            <li><p>
                    <b>使用者名:</b>
                    <%=request.getParameter("username")%>
                </p></li>
            <li><p>
                    <b>Email:</b>
                    <%=request.getParameter("email")%>
                </p></li>
        </ul>
    </div>
</body>
</html>

建立另一個顯示表單的HTML檔案:form.jsp,其內容如下所示 -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用者表單</title>
</head>
<body>
    <div style="margin: auto; width: 80%">
        <form action="setCookies.jsp" method="POST">
            使用者名: <input type="text" name="username">
            Email: <input type="text" name="email" /> <input
                type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

當編寫上面程式碼完成後,部署和執行這個專案,開啟瀏覽器存取URL:http://localhost:8080/CookiesHandling/form.html , 在顯示的表單中輸入使用者名和Email,然後單擊提交按鈕。這將在螢幕上顯示使用者名和Email,並且還將設定兩個cookie:usernameemail。當下次存取頁面時,這些Cookie將被傳回伺服器。

分別在使用者名和Email輸入框中填寫:maxsu[email protected] , 然後點選提交 -

在下一節中,我們將介紹如何在Web應用程式中存取這些cookie。

使用JSP讀取Cookies

要使用JSP讀取cookie,需要通過呼叫HttpServletRequestgetCookies()方法來建立一個javax.servlet.http.Cookie物件的陣列。 然後迴圈遍歷陣列,並使用getName()getValue()方法來存取每個cookie和關聯的值。

現在來看看如何讀取前面的例子中設定的cookie,建立一個JSP檔案:getCookies.jsp -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>讀取Cookies</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <%
            Cookie cookie = null;
            Cookie[] cookies = null;

            // Get an array of Cookies associated with the this domain
            cookies = request.getCookies();

            if (cookies != null) {
                out.println("<h2>找到的Cookie名稱和值</h2>");

                for (int i = 0; i < cookies.length; i++) {
                    cookie = cookies[i];
                    out.print("Name : " + cookie.getName() + ",  ");
                    out.print("Value: " + cookie.getValue() + " <br/>");
                }
            } else {
                out.println("<h2>No cookies founds</h2>");
            }
        %>
    </div>
</body>
</html>

重新部署專案,開啟瀏覽器存取URL: http://localhost:8080/CookiesHandling/getCookies.jsp ,應該會看到結果如下 -

使用JSP刪除Cookie

刪除cookies非常簡單。如果想要刪除一個cookie,那麼只需要按照這三個步驟 -

  • 讀取已存在的cookie並將其儲存在Cookie物件中。
  • 使用setMaxAge()方法將Cookie的過期時間設定為零,以刪除現有的Cookie。
  • 將此cookie新增回響應頭。

以下範例將顯示如何刪除名為username的現有Cookie,並且下次執行存取getcookies.jsp時,將不再返回username的cookies值。

檔案:deleteCookies.jsp -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>刪除Cookies</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <center>
         <h1>刪除Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;

         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();

         if( cookies != null ) {
            out.println("<h2>找到的Cookie名稱和值</h2>");
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               if(cookie.getName().equals("username")) {
                  cookie.setMaxAge(0);
                  response.addCookie(cookie);
                  out.print("Deleted cookie: " + cookie.getName( ) + "<br/>");
               }
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println(
            "<h2>No cookies founds</h2>");
         }
      %>
    </div>
</body>
</html>

重新部署專案,開啟瀏覽器存取URL: http://localhost:8080/CookiesHandling/deleteCookies.jsp ,應該會看到結果如下 -

現在再次執行:getCookies.jsp,它應該只顯示一個cookie,如下所示:

也可以手動刪除瀏覽器中的Cookie。從工具選單開始,選擇Internet選項。要刪除所有Cookie,請單擊刪除Cookie按鈕。