Cookie技術
一、什么是 Cookie?
1、Cookie 翻譯過來是餅干的意思, 2、Cookie 是服務器通知客戶端保存鍵值對的一種技術, 3、客戶端有了 Cookie 后,每次請求都發送給服務器, 4、每個 Cookie 的大小不能超過 4kb二、如何創建 Cookie
2.1、創建Cookie的流程

2.2、具體操作
①創建一個JavaEE工程

② 將cookie的演示檔案拷貝到web目錄下


③ 創建一個包用來存放Servlet程式

④ 將BaseServlet拷貝到創建的包下

⑤ 創建CookieServlet程式
package com.zixue.servlet; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author Mr Guo * @create 2020-11-16 14:49 */ public class CookieServlet extends BaseServlet{ protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.創建Cookie Cookie cookie = new Cookie("key1", "value1"); //2.通知客戶端保存Cookie resp.addCookie(cookie); //1.創建Cookie Cookie cookie1 = new Cookie("key2", "value2"); //2.通知客戶端保存Cookie resp.addCookie(cookie1); resp.getWriter().write("Cookie創建成功"); } }
⑥ 修改cookie.html頁面中創建Cookie的地址

⑦解決回應中文亂碼問題

⑧ 啟動專案,瀏覽器訪問cookie.html頁面

三、服務器如何獲取 Cookie
服務器獲取客戶端的 Cookie 只需要一行代碼:req.getCookies():獲取到一個Cookie[]陣列,3.1、獲取流程
3.2、具體操作
① 在CookieServlet程式中創建getCookie方法用于獲取Cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { //getName方法回傳Cookie的key //getValue方法回傳Cookie的value resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>"); } }
② 修改cookie.html頁面獲取Cookie的訪問地址

③ 瀏覽器訪問

3.3、獲取某個key的Cookie
有時候,我們要獲取某個特定的Cookie,比如key1,而這種情況開發中很長見,具體操作如下:
① 創建CookieUtils工具類

② 宣告一個方法,用來查找指定名稱的Cookie物件
public class CookieUtils { /** * 查找指定名稱的Cookie物件 * @param name * @param cookies * @return 如果回傳null,表示沒有這個名稱對應的Cookie物件,否則就是找到了指定名稱的cookie物件 */ public static Cookie findCookie(String name, Cookie[] cookies){ if (name == null || cookies == null || cookies.length == 0){ return null; } for (Cookie cookie : cookies) { if (name.equals(cookie.getName())){ return cookie; } } return null; } }
③ CookieServlet程式中查找指定的Cookie物件
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); Cookie iWantCookie = CookieUtils.findCookie("key1", cookies); if (iWantCookie != null){ resp.getWriter().write("找到了需要的Cookie"); } }
四、Cookie 值的修改
方案一: 1、先創建一個要修改的同名(指的就是 key)的 Cookie 物件 2、在構造器,同時賦于新的 Cookie 值, 3、呼叫 response.addCookie( Cookie );CookieServlet程式:
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("key1", "newValue1"); resp.addCookie(cookie); resp.getWriter().write("Cookie中的值已經修改了"); }
cookie.html頁面:

方案二: 1、先查找到需要修改的 Cookie 物件 2、呼叫 setValue()方法賦于新的 Cookie 值, 3、呼叫 response.addCookie()通知客戶端保存修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); if (cookie != null){ cookie.setValue("newValue2"); resp.addCookie(cookie); } }
五、瀏覽器查看 Cookie
谷歌瀏覽器如何查看 Cookie:

火狐瀏覽器如何查看 Cookie:

六、Cookie 生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么時候被銷毀(洗掉) setMaxAge() 正數,表示在指定的秒數后過期 負數,表示瀏覽器一關,Cookie 就會被洗掉(默認值是-1) 零,表示馬上洗掉 CookieCookieServlet程式:
/** * 默認的會話級別的Cookie * @param req * @param resp * @throws ServletException * @throws IOException */ protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("defaultLife", "defaultLife"); cookie.setMaxAge(-1);//設定存活時間 resp.addCookie(cookie); } /** * 馬上洗掉一個Cookie * @param req * @param resp * @throws ServletException * @throws IOException */ protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //先找到你要洗掉的Cookie物件 Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); //設定setMaxAge(0) cookie.setMaxAge(0);//表示馬上洗掉,不需要等瀏覽器關閉 resp.addCookie(cookie); resp.getWriter().write("key2的Cookie已經被洗掉了"); } /** * 設定存活一個小時的Cookie * @param req * @param resp * @throws ServletException * @throws IOException */ protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("life3600", "life3600"); cookie.setMaxAge(60 * 60);//設定Cookie一小時之后被洗掉 resp.addCookie(cookie); resp.getWriter().write("已經創建了一個存活一小時的Cookie"); }
cookie.html頁面:

七、Cookie 有效路徑 Path 的設定
Cookie 的 path 屬性可以有效的過濾哪些 Cookie 可以發送給服務器,哪些不發, path 屬性是通過請求的地址來進行有效的過濾, CookieA path=/工程路徑 CookieB path=/工程路徑/abc
CookieServlet程式:
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("path1", "path1"); cookie.setPath(req.getContextPath() + "/abc"); resp.addCookie(cookie); resp.getWriter().write("創建了一個帶有path路徑的cookie"); }
cookie.html頁面:

八、Cookie 練習---免輸入用戶名登錄
8.1、實作流程

8.2、具體操作
login.jsp頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="http://localhost:8080/cookie_session/loginServlet" method="get"> 用戶名:<input type="text" name="username" value="${cookie.username.value}"> <br> 密碼:<input type="password" name="password"> <br> <input type="submit" value="登錄"> </form> </body> </html>
LoginServlet程式:
public class LoginServlet extends BaseServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); if ("wzg168".equals(username) && "123456".equals(password)){ //登錄成功 Cookie cookie = new Cookie("username", username); cookie.setMaxAge(60 * 60 * 24 * 7);//當前cookie一周內有效 resp.addCookie(cookie); System.out.println("登錄成功"); }else{ //登錄失敗 System.out.println("登錄失敗"); } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/220340.html
標籤:Java
