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)
零,表示马上删除 Cookie
CookieServlet程序:
/** * 默认的会话级别的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("登录失败"); } } }