一、Cookie概述
Cookie 是服务端在 HTTP 响应汇总附带传给浏览器的一个小的文本文件,浏览器一旦接收到,会自动保存在本地。当浏览器保存了某个 cookie ,在之后的请求和响应过程中,会将次 cookie 来回传递,这样就可以通过 cookie 这个载体,完成客户端与服务端的数据交互。
实战理解
-
我们新建一个 cookie.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>cookie</title> </head> <body> <h1>Cookie</h1> <% Cookie cookie = new Cookie("name", "33"); // response.addCookie(cookie); %> </body> </html>
我们先清理一下浏览器的缓存,清理的缓存中必须包括 cookie 这个选项。然后访问
http://localhost:8080/
,打开 调试工具
然后我们再次刷新这个页面
-
现在我们访问
cookie.jsp
再刷新一次
cookie.jsp
-
我们再刷新一次
http://localhost:8080/
,看看他的请求头
-
可以访问其他页面,
Request Headers
中都有我们设置的 cookie。 -
注意事项:
- 我们重启服务器 tomcat 时,在不清理缓存的情况下,再次请求
http://localhost:8080/
,会发现我们设置的 cookie 依然存在,因为 cookie 存在于本机,与服务器没有关系。 - cookie 的设置类似于 map ,有覆盖作用,意思就是,我们写两个 name 为 admin 的cookie,第二个 admin 会将第一个 admin 的 value覆盖。
- 我们重启服务器 tomcat 时,在不清理缓存的情况下,再次请求
二、cookie创建于读取
-
创建 cookie
-
通过 Cookie 的构造函数创建:
// cookie 的构造函数 public Cookie(String name, String value) { validation.validate(name); this.name = name; this.value = value; }
-
创建 cookie ,响应到浏览器
// 1. 创建 cookie Cookie cookie = new Cookie("name", "33"); // 2. 响应到浏览器 response.addCookie(cookie);
-
-
读取 cookie,cookie 存储在 request 中
// 读取 cookie Cookie[] cookies = request.getCookies(); for (Cookie cookieItem:cookies) { out.write(cookieItem.getName()+": "+cookieItem.getValue()+"</br>"); } // 页面响应 // name: 33 // JSESSIONID: CA202E4D80F551E5160DAE1D459B65D6
三、cookie的常用方法
方法 | 描述 |
---|---|
void setMaxAge(int age) | 设置 cookie 的失效时间,单位为秒 |
int getMaxAge() | 获取 cookie 的有效时间。默认值为-1 |
String getName() | 获取 cookie 的name |
String getValue() | 获取 cookie 的value |
四、Session 与 Cookie 的区别
-
session 保存在服务器,具体点儿就是在java虚拟机中,在运行java程序的内存中,当结束程序时,session也就没了,cookie 保存在浏览器。
-
session 里面保存的数据是 Object 类型,cookie 只能保存文本类型,只能保存 String 类型。
-
session 会随着会话的结束而消息,cookie 可以长期保存在浏览器中,与会话无关。
-
session 保存重要信息,cookie 保存不重要信息,比如你看的视频记录,看到30min15s。
-
session 使用setAttribute(name, “admin”) 存储,getAttribute(name) 取,从生命周期来看的话,服务器–只要 WEB 应用重启就销毁,客户端–只要浏览器关闭就销毁。cookie:使用构造函数进行创建,使用response.add(cookie)进行存储。使用一下代码取 cookie
Cookie[] cookies = request.getCookies(); for (Cookie cookieItem:cookies) { if (cookieItem.getName().equals("username")){ out.write(cookieItem.getValue()); } }
生命周期:不随服务端的重启而销毁。客户端:默认是管理浏览器就销毁,我们可以通过 setMaxAge() 方法设置有效期,一旦设置有效期,则不随浏览器的关闭而销毁,而是由设置的时时间来决定。
-
退出登录:session.invalidate(),cookie.setMaxAge(0)
五、使用 cookie 登录
-
新建
cookieLogin.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>CookieLogin</title> </head> <body> <form action="/cookieLogin" method="post"> <table> <tr> <td>用户名:</td> <td> <input type="text" name="username"/> </td> </tr> <tr> <td>密码:</td> <td> <input type="password" name="password"/> </td> </tr> <tr> <td> <input type="submit" value="登录"> </td> <td> <input type="reset" value="重置"> </td> </tr> </table> </form> </body> </html>
-
新建
cookieWelcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>CookieWelcome</title> </head> <body> <% Cookie[] cookies = request.getCookies(); for (Cookie cookieItem:cookies) { if (cookieItem.getName().equals("username")){ out.write("欢迎回来" + cookieItem.getValue()); } } %> <a href="/cookieLogout">退出登录</a> </body> </html>
-
新建
cookieServlet.java
package com.sunshine.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author 田港 * @version 1.0 * @date 2021-03-31 13:31 */ @WebServlet("/cookieLogin") public class CookieLogin extends HttpServlet { private String myusername = "admin"; private String mypassword = "123456"; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter(("password")); if (this.myusername.equals(username) && this.mypassword.equals(password)){ Cookie cookie = new Cookie("username", username); cookie.setMaxAge(60*60*24*7); // cookie 保存一周 resp.addCookie(cookie); resp.sendRedirect("cookieWelcome.jsp"); }else { resp.sendRedirect("cookieLogin.jsp"); } } }
-
新建
cookieLogout.java
package com.sunshine.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author 田港 * @version 1.0 * @date 2021-03-31 14:38 */ @WebServlet("/cookieLogout") public class cookieLogout extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { cookie.setMaxAge(0); resp.addCookie(cookie); resp.sendRedirect("cookieLogin.jsp"); } } } }