【Head First Servlets and JSP】筆記11:cookie

來源:互聯網
上載者:User

標籤:exce   height   pos   bsp   最簡   map   1.0   post   部落格   

容器如何知道客戶是誰?(這並不是HTTP能實現的!IP地址不能唯一的標識使用者,另外,非必要不採用HTTPS

繼續mark孤傲蒼狼的部落格,百科全書

cookie——Header——字典——索引值對——

延長cookie的保質期

容器會做cookie的所有工作!

 

1、先搭建一個簡單的測試程式——使用cookie記錄使用者上一次訪問的時間(tomcat+web.xml+servlet

<?xml version="1.0" encoding="ISO-8859-1" ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"         version="2.4">    <servlet>        <servlet-name>test cookie</servlet-name>        <servlet-class>com.example.web.TestCookie</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>test cookie</servlet-name>        <url-pattern>/testCookie.do</url-pattern>    </servlet-mapping></web-app>
package com.example.web;import javax.servlet.ServletException;import javax.servlet.http.*;import java.io.*;import java.util.Date;public class TestCookie extends HttpServlet {    @Override    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setCharacterEncoding("UTF-8"); // 不加這句輸出中文會亂碼!        resp.setContentType("text/html");        PrintWriter out = resp.getWriter();        Cookie[] cookies = req.getCookies(); // 擷取瀏覽器訪問訪問伺服器時傳遞過來的cookie數組        // 如果使用者是第一次訪問,那麼得到的cookies將是null        if (cookies != null) {            out.write("您上次訪問的時間是:");            for (int i = 0; i < cookies.length; ++i) {                Cookie cookie = cookies[i];                if (cookie.getName().equals("lastAccessTime")) {                    Long lastAccessTime = Long.parseLong(cookie.getValue());                    Date date = new Date(lastAccessTime);                    out.write(date.toString());                }            }        }else {            out.write("這是您第一次訪問本站!");        }        // 使用者訪問過之後重新設定使用者的訪問時間,儲存到cookie中,然後發送到用戶端瀏覽器        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); // 建立一個cookie,cookie的名字是lastAccessTime        resp.addCookie(cookie); // 將cookie對象添加到response對象中,這樣伺服器在輸出response對象中的內容時就會把cookie也輸出到用戶端瀏覽器    }    @Override    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doPost(req, resp);    }}

不管怎樣,先把程式跑起來,初次體驗一下自己寫的servlet能“認人”的感覺,不過糟糕的是,重啟瀏覽器後,它就會把你“忘”了。

好吧,事實上伺服器並不記得你,而是根據用戶端發來的cookie做出一系列響應罷了。

 

2、什麼是cookie?

小時候,經常遇到玩網頁遊戲打不開頁面的情況,這個時候會開啟“瀏覽器工具箱”清除一下cookie...

曾經有一位前輩是這樣告訴我的,cookie就是“字典”(一頭霧水,看過書之後,我更新了這個認識。

那麼,到底什麼是cookie呢?

cookie就是一個Header,

結合1中的小程式,在響應中它大概長這個樣子:

Set-Cookie:lastAccessTime=1496524276849而在請求中它是這個樣子的:Cookie:lastAccessTime=1496524103876,關掉瀏覽器重啟後他在請求首部的集合中根本不存在!這樣的話,我們可以推斷,
  • cookie是需要服務端來設定的,不設定就沒有!難怪響應中叫Set-Cookie
  • cookie可以儲存在用戶端的瀏覽器中,並且預設情況下,有效期間僅限於“一個瀏覽器周期”。(瀏覽器開啟到關閉的時期)

既然cookie存在本地,那我們有沒方法可以查看呢?顯然是可以的。

 

3、容器如何知道客戶是誰?

cookie——“號碼牌”

容器必須以某種方式把會話ID作為響應的一部分交給客戶,

而客戶必須把會話ID作為請求的一部分發回,

最簡單、最常用的是通過cookie交換這個會話資訊。

 

4、延長cookie的“保質期”

 這是一項很容易的工作,只要把cookie儲存的本地就可以了!

參考apache的api,要完成這件事情,需要藉助setMaxAge(int expiry) 修改1中的代碼:

        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); // 建立一個cookie,cookie的名字是lastAccessTime        cookie.setMaxAge(60); // 給cookie加個期限,單位是秒        resp.addCookie(cookie); // 將cookie對象...

 

 

【Head First Servlets and JSP】筆記11:cookie

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.