1. 程式人生 > >Cookie建立-獲取-持久化、自動登入、購物記錄、作用路徑

Cookie建立-獲取-持久化、自動登入、購物記錄、作用路徑

1、cookie是啥?隨手百度了網友的說說
簡單的說,Cookie就是伺服器暫存放在你計算機上的一筆資料,好讓伺服器用來辨認你的計算機。當你在瀏覽網站的時候,Web伺服器會先送一小小資料放在你的計算機上,當下次你再光臨同一個網站,Web伺服器會先看看有沒有它上次留下的Cookie資料,有的話,就會依據Cookie裡的內容來判斷使用者,送出特定的網頁內容給你。

2、cookie在哪裡?
這裡寫圖片描述這裡寫圖片描述

3、cookie可以刪除嗎?
這裡寫圖片描述這裡寫圖片描述

4、cookie實現原理

第一次請求瀏覽器,在瀏覽器的cookie儲存區,沒有cookie,
第一次訪問不帶Cookie,瀏覽器通過Http請求訊息中增加Cookie請求頭將Cookie回傳給web伺服器,瀏覽器會把Cookie的資訊片斷以”名/值”對(name-value pairs)的形式儲存儲存在本地,下次訪問,web伺服器通過http響應訊息中增加Set-Cookie響應頭,將Cookie資訊傳送給瀏覽器

我們通過實際來看下cookie吧

建立一個cookie.jsp,為了便於觀察,設定session=”false”

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!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>Insert title here</title> </head> <body> <% //建立一個cookie Cookie cookie = new Cookie("name","wyf"); response.addCookie(cookie); %> </body> </html>


請求標頭中,可以看到首次訪問是不攜帶cookie的
這裡寫圖片描述
在響應標頭中,通過Set-Cookie傳回,並且儲存在瀏覽器本地cookie儲存區
這裡寫圖片描述

我們第二次訪問cook.jsp檔案,看看有沒有變化
請求標頭中,可以看到再次訪問,是從瀏覽器本地cookie儲存區,攜帶cookie的請求的
這裡寫圖片描述
如下是響應標頭:
這裡寫圖片描述

我們用一個互動圖,來了解下cookie機制:
這裡寫圖片描述

我們來看下cookie的建立、獲取
cookie.jsp中程式碼意思是:如果請求中,沒有cookie,就建立並返回,請求中帶cookie的話,就輸出cookie鍵值對(name-value)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!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>Insert title here</title>
</head>
<body>
<%
    Cookie[] cookies = request.getCookies();
    if(cookies !=null && cookies.length>0){
        for(Cookie cookie : cookies){
            out.print(cookie.getName()+":"+cookie.getValue());
        }
    }else{
        out.print("沒有cookie,正在建立,並且返回");
        Cookie cookie = new Cookie("name","wyf");
        response.addCookie(cookie);
    }
%>
</body>
</html>

第一次訪問
這裡寫圖片描述
第二次訪問
這裡寫圖片描述

以上操作是我們需要重新關閉瀏覽器,在進行除錯為什麼呢?
因為預設情況下,cookie是一個會話級別的cookie,儲存在瀏覽器的核心中,使用者退出瀏覽器後被刪除,若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,單位為秒

我們來看下持久化cookie

<%
    Cookie[] cookies = request.getCookies();

    if(cookies !=null && cookies.length>0){
        for(Cookie cookie : cookies){
            out.print(cookie.getName()+":"+cookie.getValue());
        }
    }else{
        out.print("沒有cookie,正在建立,並且返回");
        Cookie cookie = new Cookie("name","wyf");
        cookie.setMaxAge(30);
        response.addCookie(cookie);
    }
%>

cookie.setMaxAge(30);設定為30秒,這裡就不截圖了,說名下即可,第一次訪問沒有cookie建立cookie,第二次訪問輸出cookie鍵值對,關閉瀏覽器,在30秒內訪問,依然提示cookie鍵值對,而不是之前的提示沒有cookie建立cookie

自動登入
這裡寫圖片描述

login.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>Insert title here</title>
</head>
<body>
    <form action="success.jsp" method="post">
        name:<input type="text" name="name"/>
        <input type="submit" value="sumit"/>
    </form>
</body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!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>Insert title here</title>
</head>
<body>

    <%
        //若可以獲取到引數name,則列印登入資訊,將資訊儲存到cookie中,並設定cookei的時間
        String name = request.getParameter("name");
        if (name != null && !name.trim().equals("")) {
            Cookie cookie = new Cookie("nameCookie", name);
            cookie.setMaxAge(60);
            response.addCookie(cookie);
        } else {
            //如果沒有引數,可以用cookie登入,從cookie中讀取使用者資訊,如果存在則列印歡迎資訊
            Cookie[] cookies = request.getCookies();
            if (cookies != null && cookies.length > 0) {
                for (Cookie cookie : cookies) {
                    String cookieName = cookie.getName();
                    if ("nameCookie".equals(cookieName)) {
                        String val = cookie.getValue();
                        name = val;
                    }
                }
            }
        }

        if (name != null && !name.trim().equals("")) {
            out.print("hello" + name);
        } else {
            //若沒有請求引數,也沒有cookie,則重定向到login.jsp
            response.sendRedirect("login.jsp");
        }
    %>

</body>
</html>

第一次訪問http://localhost:8080/day01/login.jsp輸入name引數值,提交,在success.jsp中,首先獲取提交過來的引數name值,如果不為null,那麼就直接設定一個cookie,儲存引數name值,然後頁面輸出name引數值,第二次訪問直接輸入http://localhost:8080/day01/success.jsp,
由於這次麼有攜帶引數name值,我們只需要從cookie的value值中獲取值,然後顯示輸出即可

顯示最近的購物記錄
這裡寫圖片描述
books.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>Insert title here</title>
</head>
 <body>
    <h4>Books Page</h4>
    <a href="book.jsp?book=JavaWeb">JavaWeb</a>
    <a href="book.jsp?book=Java">Java</a>
    <a href="book.jsp?book=Oracle">Oracle</a>
    <a href="book.jsp?book=Ajax">Ajax</a>
    <a href="book.jsp?book=JavaScript">JavaScript</a>
    <a href="book.jsp?book=Android">Android</a>
    <a href="book.jsp?book=Jbpm">Jbpm</a>
    <br><br>
    <%
        //獲取所有的Cookie
        Cookie[] cookies = request.getCookies();
        //從篩選出的Book的Cookie,如果cookieName為ATGUIGU_BOOK_ 開頭的即符合條件
        if(cookies!=null&&cookies.length>0){
            for(Cookie c:cookies){
                String cookieName = c.getName();
                if(cookieName.startsWith("Safly")){
                //顯示cookieValue
                    out.println(c.getValue());
                    out.print("<br>");
                }
            }
        }
     %>
  </body>
</html>

book.jsp

<%@page import="java.util.ArrayList"%>
<%@ 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>Insert title here</title>
</head>
<body>
 Book:<%= request.getParameter("book") %>
    <br><br>
    <a href="books.jsp">return</a>

    <%
        String book = request.getParameter("book");
        //確定要被刪除的Cookie
        Cookie[] cookies = request.getCookies();
        //儲存所有Safly 開頭的Cookie
        ArrayList<Cookie> bookCookies = new ArrayList<Cookie>();
        //用來儲存和books.jsp 傳入的book匹配的那個Cookie
        Cookie tempCookie = null;
        if(cookies!=null&&cookies.length>0){
            for(Cookie c:cookies){
                String cookieName = c.getName();
                if(cookieName.startsWith("Safly")){
                    bookCookies.add(c);

                    //選購5個之後,在選5箇中的一個
                    if(c.getValue().equals(book)){
                        out.print("c.getValue().equals(book)");
                        tempCookie = c;
                    }
                }
            }
        }
        //選購5個選除這5本以外的一本
        if(bookCookies.size() >= 5&&tempCookie == null){
            tempCookie = bookCookies.get(0); //
            out.print("tempCookie == null");
        }
        //若在其中則刪除bookCookie本身,將列表的重複cookie刪掉,並且將其回傳
        if(tempCookie != null){
            tempCookie.setMaxAge(0);
            response.addCookie(tempCookie);
        }
        //把從books.jsp傳入的book作為一個Cook返回
        Cookie cook = new Cookie("Safly"+book,book);
        response.addCookie(cook);

     %>
</body>
</html>

說一下邏輯關係:
在Books.jsp中以下是書籍的列表,
JavaWeb
Java
Oracle
Ajax
JavaScript
Android
Jbpm
我隨便選擇一個連結(比如JavaWeb),去跳轉到book.jsp,第一次訪問是沒有帶Cookie的,所以會呼叫book.jsp如下的方法,建立了一個cookie,在book.jsp頁面中,點選return返回到books.jsp就取出cooks.jsp帶過來的cookieValue,然後展現選中的書籍列表即可

 Cookie cook = new Cookie("Safly"+book,book);
        response.addCookie(cook);

此刻已經回到books.jsp中,已經選擇了JavaWeb一本書,我們在選擇一本(假如Java),然後跳轉到books.jsp,此刻我們會帶著1個cookie(就是第一次選中JavaWeb訪問books.jsp時候,給我傳過來的),這個cookie的鍵值就是SaflyJavaWeb–JavaWeb,但是呢?選中第二本書Java是沒有帶cookie的(沒有SaflyJava–Java)
然後就進入到cooks.jsp中

if(cookieName.startsWith("Safly")){
                    bookCookies.add(c);}

所以也就將SaflyJavaWeb–JavaWeb放入到一bookCookies中(存放選中的書籍列表)然後呢,那個SaflyJava–Java就會建立,在點選renturn時候,反給cookies.jsp

。。。。第3、4、5次選擇書時,是一樣的過程
如果等books.jsp中選擇了5本書時候,在選擇這5本書中的某一本時候,怎麼處理呢?
c.getValue().equals(book)來獲取選中的那本書,我們需要將此cookie刪除然後,從新新增進來然後回傳給cookies.jsp程式碼如下:

tempCookie.setMaxAge(0);
response.addCookie(tempCookie);

如果等books.jsp中選擇了5本書時候,在選擇非此5本書的第6本書,怎麼處理呢?
我們就tempCookie = bookCookies.get(0); 取出來那5本書的第一本,然後tempCookie.setMaxAge(0);刪除調第一本的cookie,然後將第6本書,建立cookie回傳給cookies.jsp即可

以下是部分截圖:
這裡寫圖片描述這裡寫圖片描述

cookie的作用路徑
cookie2.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>Insert title here</title>
</head>
<body>
<%
        String cookieValue = null;
        Cookie [] cookies = request.getCookies();
        if(cookies!=null&& cookies.length>0){
            for(Cookie cookie:cookies){
                if("cookiePath".equals(cookie.getName())){
                    cookieValue = cookie.getValue();
                }
            }
        }
        if(cookieValue != null){
            out.print(cookieValue);
        }else{
            out.print("沒有指定的cookie");
        }
     %>
</body>
</html>

writerCookie.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>Insert title here</title>
</head>
<body>
 <%
    //可以作用當前目錄,和當前目錄的子目錄,但不能作用於當前目錄的上一級目錄
    //可以通過setPath設定cookie的作用範圍,/代表站點的根目錄
        Cookie cookie = new Cookie("cookiePath","CookiePathValue");
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);
     %>
     <a href="../cookie2.jsp">to cookie2.jsp</a>


</body>
</html>

to cookie2.jsp就是訪問writerCookie.jsp上級目錄的cookie2.jsp

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述