學習Cookie的基礎知識

知識儲備

首先要先了解什麼是會話,會話就是用戶打開一個瀏覽器,點擊多個鏈接,然後會訪問多個WEB服務,然後再關閉瀏覽器。
有兩種保存會話數據的技術,可以保存用戶的數據,就比如像你購物車裏的數據。而這兩種技術分別是Cookie技術和HttpSession技術。

Cookie的概述
Cookie是客戶端技術,程序會把每一個用戶的數據以Cookie的形式寫給用戶各自的瀏覽器。當用戶再使用瀏覽器去訪問服務器中WEB資源的時候,就會帶着各自的數據去。

Cookie API
javax.servlet.http.Cookie類用於法,它用於在其響應頭中增加一個相應的Set-Cooki創建一個Cookie,response接口中定義了一個addCookie方e頭字段。 同樣,request接口中也定義了一個getCookies方法,它用於獲取客戶端提交的Cookie。Cookie類的方法:
public Cookie(String name,String value)
setValue與getValue方法
setMaxAge與getMaxAge方法 (秒)
setPath與getPath方法
setDomain與getDomain方法
getName方法

例子演示:

*1. 獲取客戶端最後訪問時間:
//告訴服務器應該使用UTF-8來解析文件,告訴客戶端使用什麼來編碼
response.setContentType("text/html;charset=UTF-8");
//得到一個字符輸出流
PrintWriter out = response.getWriter();
//獲取客戶端保存的最後訪問時間
Cookie[] cookies = request.getCookies();//獲取客戶端的所有Cookie對象
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("lastAccessTime".equals(cookies[i].getName())){//判斷當前Cookie中的name是否是想要的cookie
long l = Long.parseLong(cookies[i].getValue());//如果是想要的Cookie,則把Cookie中的value取出
out.write("你的最後訪問時間爲:"+new Date(l).toLocaleString());//yyyy-MM-dd
}
}
//創建cookie,
Cookie ck = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//把cookie信息寫回到客戶端
response.addCookie(ck);

Cookie屬性
name:名稱不能唯一確定一個Cookie。路徑可能不同。
value:不能存中文。
path:默認值是寫Cookie的那個程序的訪問路徑

  • 比如:http://localhost:8080/day10/servlet/demo1寫的Cookie
  • path就是:/day10/servlet 看當前創建cookie的資源(servlet)文件路徑
  • 客戶端在訪問服務器另外資源時,根據訪問的路徑來決定是否帶着Cookie到服務器
  • 當前訪問的路徑如果是以cookie的path開頭的路徑,瀏覽器就帶。否則不帶。

maxAge:cookie的緩存時間。默認是-1(默認存在瀏覽器的內存中)。單位是秒。

負數:cookie的數據存在瀏覽器緩存中
0:刪除。路徑要保持一致,否則可能刪錯人。
正數:緩存(持久化到磁盤上)的時間

演示代碼:

    //告訴服務器應該使用UTF-8來解析文件,告訴客戶端使用什麼來編碼
    response.setContentType("text/html;charset=UTF-8");
    //得到一個字符輸出流
    PrintWriter out = response.getWriter();
    //獲取客戶端保存的最後訪問時間
    Cookie[] cookies = request.getCookies();//獲取客戶端的所有Cookie對象
    for (int i = 0;cookies!=null && i < cookies.length; i++) {
        if("lastAccessTime".equals(cookies[i].getName())){//判斷當前Cookie中的name是否是想要的cookie
                long l = Long.parseLong(cookies[i].getValue());//如果是想要的Cookie,則把Cookie中的value取出
                out.write("你的最後訪問時間爲:"+new Date(l).toLocaleString());//yyyy-MM-dd
                    }
                }
    //創建cookie,
    Cookie ck = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
    //設置cookie的有效時間,單位是秒
    ck.setMaxAge(60*5);//保存時間爲5分鐘
    //設置cookie的path
    ck.setPath("/");//將當前目錄名給Cookie /day10
    //把cookie信息寫回到客戶端
    response.addCookie(ck);

Cookie細節

一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB。
如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。英國央行利率決議www.gendan5.com/decision/gbp.html 將最大時效設爲0則是命令瀏覽器刪除該cookie。
注意,刪除cookie時,path必須一致,否則不會刪除
根據Cookie做的簡單登錄(會記住用戶名)
LoginServlet.java

public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String userName ="";
String checked = "";
//得到客戶端保存的Cookie數據
Cookie[] cookies = request.getCookies();
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("userName".equals(cookies[i].getName())){
userName = cookies[i].getValue();
checked = "checked='checked'";
}
}

    out.write("<form action='"+request.getContextPath()+"/servlet/doLogin' method='post'>");
    out.write("用戶名:<input type='text' name='userName' value='"+userName+"'/><br/>");
    out.write("密碼:<input type='password' name='pwd'/><br/>");
    out.write("<input type='checkbox' name='remember' "+checked+" />記住用戶名<br/>");
    out.write("<input type='submit' value='登錄'/><br/>");
    out.write("</form>");

}

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

}

DoLogin.java

public class DoLogin extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    //獲取表單數據
    String userName = request.getParameter("userName");
    String pwd = request.getParameter("pwd");
    String remember = request.getParameter("remember");
    Cookie ck = new Cookie("userName", userName);
    ck.setPath("/");
    //處理業務邏輯
    //分發轉向
    if("lwb".equals(userName)){
        if("123".equals(pwd)){
            if(remember!=null){
                ck.setMaxAge(Integer.MAX_VALUE);
            }else{
                ck.setMaxAge(0);
            }
            response.addCookie(ck);
            out.write("登陸成功!");
            response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
        }else{
            out.write("密碼不正確!");
            response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
        }
    }else{
        out.write("沒有此用戶");
        response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
    }

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章