JavaWeb開發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動登錄、購物記錄、作用路徑
1、cookie是啥?隨手百度了網(wǎng)友的說說
簡單的說,Cookie就是服務(wù)器暫存放在你計算機(jī)上的一筆資料,好讓服務(wù)器用來辨認(rèn)你的計算機(jī)。當(dāng)你在瀏覽網(wǎng)站的時候,Web服務(wù)器會先送一小小資料放在你的計算機(jī)上,當(dāng)下次你再光臨同一個網(wǎng)站,Web服務(wù)器會先看看有沒有它上次留下的Cookie資料,有的話,就會依據(jù)Cookie里的內(nèi)容來判斷使用者,送出特定的網(wǎng)頁內(nèi)容給你。
2、cookie在哪里?
3、cookie可以刪除嗎?
4、cookie實(shí)現(xiàn)原理
第一次請求瀏覽器,在瀏覽器的cookie存儲區(qū),沒有cookie,
第一次訪問不帶Cookie,瀏覽器通過Http請求消息中增加Cookie請求頭將Cookie回傳給web服務(wù)器,瀏覽器會把Cookie的信息片斷以”名/值”對(name-value pairs)的形式儲存保存在本地,下次訪問,web服務(wù)器通過http響應(yīng)消息中增加Set-Cookie響應(yīng)頭,將Cookie信息發(fā)送給瀏覽器
我們通過實(shí)際來看下cookie吧
創(chuàng)建一個cookie.jsp,為了便于觀察,設(shè)置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> <% //創(chuàng)建一個cookie Cookie cookie = new Cookie("name","wyf"); response.addCookie(cookie); %> </body> </html>
我們第一次訪問cookie.jsp文件,在IE輸入
http://localhost:8080/day01/cookie.jsp
請求標(biāo)頭中,可以看到首次訪問是不攜帶cookie的
在響應(yīng)標(biāo)頭中,通過Set-Cookie傳回,并且保存在瀏覽器本地cookie存儲區(qū)
我們第二次訪問cook.jsp文件,看看有沒有變化
請求標(biāo)頭中,可以看到再次訪問,是從瀏覽器本地cookie存儲區(qū),攜帶cookie的請求的
如下是響應(yīng)標(biāo)頭:
我們用一個交互圖,來了解下cookie機(jī)制:
我們來看下cookie的創(chuàng)建、獲取
cookie.jsp中代碼意思是:如果請求中,沒有cookie,就創(chuàng)建并返回,請求中帶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,正在創(chuàng)建,并且返回"); Cookie cookie = new Cookie("name","wyf"); response.addCookie(cookie); } %> </body> </html>
第一次訪問
第二次訪問
以上操作是我們需要重新關(guān)閉瀏覽器,在進(jìn)行調(diào)試為什么呢?
因為默認(rèn)情況下,cookie是一個會話級別的cookie,存儲在瀏覽器的內(nèi)核中,用戶退出瀏覽器后被刪除,若希望瀏覽器將該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,正在創(chuàng)建,并且返回"); Cookie cookie = new Cookie("name","wyf"); cookie.setMaxAge(30); response.addCookie(cookie); } %>
cookie.setMaxAge(30);設(shè)置為30秒,這里就不截圖了,說名下即可,第一次訪問沒有cookie創(chuàng)建cookie,第二次訪問輸出cookie鍵值對,關(guān)閉瀏覽器,在30秒內(nèi)訪問,依然提示cookie鍵值對,而不是之前的提示沒有cookie創(chuàng)建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> <% //若可以獲取到參數(shù)name,則打印登錄信息,將信息存儲到cookie中,并設(shè)置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 { //如果沒有參數(shù),可以用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 { //若沒有請求參數(shù),也沒有cookie,則重定向到login.jsp response.sendRedirect("login.jsp"); } %> </body> </html>
第一次訪問http://localhost:8080/day01/login.jsp輸入name參數(shù)值,提交,在success.jsp中,首先獲取提交過來的參數(shù)name值,如果不為null,那么就直接設(shè)置一個cookie,保存參數(shù)name值,然后頁面輸出name參數(shù)值,第二次訪問直接輸入http://localhost:8080/day01/success.jsp,
由于這次么有攜帶參數(shù)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本身,將列表的重復(fù)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>
說一下邏輯關(guān)系:
在Books.jsp中以下是書籍的列表,
JavaWeb
Java
Oracle
Ajax
JavaScript
Android
Jbpm
我隨便選擇一個鏈接(比如JavaWeb),去跳轉(zhuǎn)到book.jsp,第一次訪問是沒有帶Cookie的,所以會調(diào)用book.jsp如下的方法,創(chuàng)建了一個cookie,在book.jsp頁面中,點(diǎn)擊return返回到books.jsp就取出cooks.jsp帶過來的cookieValue,然后展現(xiàn)選中的書籍列表即可
Cookie cook = new Cookie("Safly"+book,book); response.addCookie(cook);
此刻已經(jīng)回到books.jsp中,已經(jīng)選擇了JavaWeb一本書,我們在選擇一本(假如Java),然后跳轉(zhuǎn)到books.jsp,此刻我們會帶著1個cookie(就是第一次選中JavaWeb訪問books.jsp時候,給我傳過來的),這個cookie的鍵值就是SaflyJavaWeb–JavaWeb,但是呢?選中第二本書Java是沒有帶cookie的(沒有SaflyJava–Java)
然后就進(jìn)入到cooks.jsp中
if(cookieName.startsWith("Safly")){ bookCookies.add(c);}
所以也就將SaflyJavaWeb–JavaWeb放入到一bookCookies中(存放選中的書籍列表)然后呢,那個SaflyJava–Java就會創(chuàng)建,在點(diǎn)擊renturn時候,反給cookies.jsp
。。。。第3、4、5次選擇書時,是一樣的過程
如果等books.jsp中選擇了5本書時候,在選擇這5本書中的某一本時候,怎么處理呢?
c.getValue().equals(book)來獲取選中的那本書,我們需要將此cookie刪除然后,從新添加進(jìn)來然后回傳給cookies.jsp代碼如下:
tempCookie.setMaxAge(0); response.addCookie(tempCookie);
如果等books.jsp中選擇了5本書時候,在選擇非此5本書的第6本書,怎么處理呢?
我們就tempCookie = bookCookies.get(0); 取出來那5本書的第一本,然后tempCookie.setMaxAge(0);刪除調(diào)第一本的cookie,然后將第6本書,創(chuàng)建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> <% //可以作用當(dāng)前目錄,和當(dāng)前目錄的子目錄,但不能作用于當(dāng)前目錄的上一級目錄 //可以通過setPath設(shè)置cookie的作用范圍,/代表站點(diǎn)的根目錄 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
以上所述是小編給大家介紹的JavaWeb開發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動登錄、購物記錄、作用路徑,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法
EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單,節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法,需要的朋友可以參考下2022-08-08Jackson反序列化@JsonFormat 不生效的解決方案
這篇文章主要介紹了Jackson反序列化@JsonFormat 不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08基于Spring開發(fā)之自定義標(biāo)簽及其解析
Spring框架是現(xiàn)在Java最流行的開源框架之一,需要實(shí)現(xiàn)一些自定義的標(biāo)簽,主要是方便使用我們框架的人能夠快速、簡單進(jìn)行配置,有興趣的可以了解一下。2017-04-04Mybatis Properties 配置優(yōu)先級詳解
這篇文章主要介紹了Mybatis Properties 配置優(yōu)先級,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07使用spring.profiles.active來分區(qū)配置的方法示例
這篇文章主要介紹了使用spring.profiles.active來分區(qū)配置的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01springboot如何實(shí)現(xiàn)導(dǎo)入其他配置類
這篇文章主要介紹了springboot如何實(shí)現(xiàn)導(dǎo)入其他配置類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11