1. 程式人生 > >JSP cookie基礎

JSP cookie基礎

HTTP是無狀態協議,這意味著每次客戶端檢索網頁時,都要單獨開啟一個伺服器連線,因此伺服器不會記錄下先前客戶端請求的任何資訊。

JSP Cookie處理

Cookie是儲存在客戶機的文字檔案,它們儲存了大量軌跡資訊。
利用cookie技術識別使用者。通常有三個步驟:

  • 伺服器指令碼傳送一系列cookie至瀏覽器。比如名字,年齡,ID號碼等等。
  • 瀏覽器在本地機中儲存這些資訊,以備不時之需。
  • 當下一次瀏覽器傳送任何請求至伺服器時,它會同時將這些cookie資訊傳送給伺服器,然後伺服器使用這些資訊來識別使用者或者幹些其它事情。

Cookie剖析

Cookie通常在HTTP資訊頭中設定(雖然JavaScript能夠直接在瀏覽器中設定cookie)。在JSP中,設定一個cookie需要傳送如下的資訊頭給伺服器:

HTTP/1.1 200 OK
Date: Wed, 10 May 2017 03:33:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=runoob; expires=Wednesday, 10-May-17 04:33:38 GMT; 
                 path=/; domain=runoob.com
Connection: close
Content-Type: text/html

Set-Cookie資訊頭包含一個鍵值對,一個GMT(格林尼治標準)時間,一個路徑,一個域名。鍵值對會被編碼為URL。有效期域是個指令,告訴瀏覽器在什麼時候之後就可以清除這個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設定Cookie

使用JSP設定cookie包含三個步驟:

/**
*   (1)建立一個Cookie物件: 
*   呼叫Cookie的建構函式,使用一個cookie名稱和值做引數,它們都是字串。
*/
Cookie cookie = new Cookie("key","value");

/**
*   (2)設定有效期: 
*   呼叫setMaxAge()函式表明cookie在多長時間(以秒為單位)內有效。
*/
cookie.setMaxAge(60*60*24); 

/**
*   (3) 將cookie傳送至HTTP響應頭中:
*   呼叫response.addCookie()函式來向HTTP響應頭中新增cookie。
*/
response.addCookie(cookie);

需要注意的是:JSP Cookie 處理需要對中文進行編碼與解碼。

String   str   =   java.net.URLEncoder.encode("中文""UTF-8");            //編碼
String   str   =   java.net.URLDecoder.decode("編碼後的字串","UTF-8");   // 解碼

例項:

cookieTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
</head>
<body>
    <form action="setCookie.jsp" method=GET>
        使用者: <input type="text" name="name"> 
        <br /> 
        密碼: <input type="text" name="pwd" /> 
        <hr>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

setCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*"%>
<%
    // 編碼,解決中文亂碼   
    String para_name = URLEncoder.encode(request.getParameter("name"), "utf-8");
    String para_pwd = URLEncoder.encode(request.getParameter("pwd"), "utf-8");

    // 設定 name 和 url cookie 
    Cookie name = new Cookie("name", para_name);
    Cookie pwd = new Cookie("pwd", para_pwd);

    // 設定cookie過期時間為1小時。
    name.setMaxAge(60 * 60 * 1);
    pwd.setMaxAge(60 * 60 * 1);

    // 在響應頭部新增cookie
    response.addCookie(name);
    response.addCookie(pwd);
%>
<html>
<head>
<meta charset="utf-8">
<title>Cookie Test</title>
</head>
<body>
    <p>此頁在jsp程式碼裡設定了cookie。</p>
    <p>請在瀏覽器檢視剛設定的cookie</p>
</body>
</html>

效果圖:
執行:
這裡寫圖片描述

檢視cookie:
這裡寫圖片描述
這裡寫圖片描述

JSP讀取Cookie

JSP讀取cookie,需要呼叫request.getCookies()方法來獲得一個javax.servlet.http.Cookie物件的陣列。該陣列儲存了cookie的所有鍵值對。
接下來我們讀取剛才的cookie。

cookieTest.html裡的程式碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
</head>
<body>
    <form action="setCookie.jsp" method=GET>
        使用者: <input type="text" name="name"> 
        <br /> 
        密碼: <input type="text" name="pwd" /> 
        <hr>
        <input type="submit" value="提交" />
    </form>
    <br>
    <hr>
    <form action="getCookie.jsp" method=GET>
        <input type="submit" value="getCookie" />
    </form>
</body>
</html>

getCookie.jsp裡的程式碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*"%>
<html>
<head>
<meta charset="utf-8">
<title>Cookie Test</title>
</head>
<body>
    <h1>getCookie</h1>
    <%
    Cookie[] cookies = request.getCookies();
    for(int i=0; i<cookies.length; i++){
        out.print("<p>");
        out.print("key:"+cookies[i].getName());
        out.print("<br>");
        out.print("value:"+cookies[i].getValue());
        out.print("</p><hr>");
    }
    %>
</body>
</html>

執行效果:
這裡寫圖片描述

JSP刪除Cookie

  • 獲取一個已經存在的cookie然後儲存在Cookie物件中。
  • 將cookie的有效期設定為0。
  • 將這個cookie重新新增進響應頭中。

這個比較簡單就不演示了。