cookie 生命周期
介绍
- Cookie 的生命周期指的是如何管理 Cookie 什么时候被销毁(删除)
- setMaxAge()
● 正数,表示在指定的秒数后过期
● 负数,表示浏览器关闭,Cookie 就会被删除(默认值是-1)
● 0,表示马上删除 Cookie
代码示例
public class CookieLive extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("CookieLive 被调用..."); //演示创建一个cookie , 生命周期为 60s Cookie cookie = new Cookie("job", "java"); //解读: // 1. 从创建该cookie开始计时, 60秒后无效 // 2. 浏览器来根据创建的时间,计时到60s秒,就认为该cookie无效 // 3. 如果该cookie无效,那么浏览器在发出http请求时,就不在携带该cookie cookie.setMaxAge(60); //将cookie保存到浏览器 response.addCookie(cookie); //演示如何删除一个cookie, 比如删除username //1 先得到username cookie Cookie[] cookies = request.getCookies(); Cookie usernameCookie = CookieUtils.readCookieByName("username", cookies); if(usernameCookie != null) { //2. 将其生命周期设置为0 usernameCookie.setMaxAge(0); //3. 重新保存该cookie, 因为你将其生命周期设置0, 就等价于让浏览器删除该cookie //4. 说明:该cookie会被浏览器直接删除 // 返回一个Set-Cookie: xxxxx => 一会抓包. // Set-Cookie: username=tom; Expires=Thu, 01-Jan-1970 00:00:10 GMT response.addCookie(usernameCookie);//返回一个Set-Cookie: xxxxx => 一会抓包. }else{ System.out.println("没有找到该cookie, 无法删除..."); } /*********************** * 默认的会话级别的 Cookie [即浏览器关闭就销毁了] * 前面我们讲课时,都是默认会话级别的生命周期 ***********************/ Cookie cookie3 = new Cookie("dkey", "dkey_value"); /** * 解读 setMaxAge源码 * public void setMaxAge(int expiry) { * this.maxAge = expiry; * } * private int maxAge = -1; 默认就是-1 */ //cookie.setMaxAge(-1);//设置存活时间 response.addCookie(cookie3); // 给浏览器返回信息 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println("<h1>设置cookie生命周期</h1>"); writer.flush(); writer.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
完成测试 , 注意抓包看数据
cookie 有效路径
有效路径规则
- Cookie 有效路径 Path 的设置
- Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。path属性是通过请求的地址来进行有效的过滤
规则如下:
cookie1.setPath = /工程路径
cookie2.setPath = /工程路径/aaa
请求地址: http://ip:端口/工程路径/资源
cookie1 会发给服务器
cookie2 不会发给服务器
请求地址: http://ip:端口/工程路径/aaa/资源
cookie1 会发给服务器
cookie2 会发给服务器
代码示例
import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CookiePathServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("keyPath1", "keyPath1Value"); // request.getContextPath() + "/aaa" 得到 /工程路径/aaa cookie.setPath(request.getContextPath() + "/aaa"); Cookie cookie2 = new Cookie("keyPath2", "keyPath2Value"); cookie2.setPath(request.getContextPath()); response.addCookie(cookie); response.addCookie(cookie2); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<h1>创建 Cookie keyPath1 路径 /工程路径/aaa </h1>"); response.getWriter().write("<h1>创建 Cookie keyPath2 路径 /工程路径 </h1>"); } }
完成测试 , 注意抓包看创建 Cookie 时,返回的数据
完成测试 , 注意抓包看读取 Cookie 时,返回的数据
代码示例
需求: 完成自动填写登录账户应用案例 , 如果用户登录成功,则下次登录自动填写登录 账户
html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <h1>用户登录界面</h1> <form action="#" method="post"> u:<input type="text" name="username"><br/> p:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
创建LoginServlet
public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("LoginServlet 被调用...~~~"); //1. 接收表单提交用户名和密码 String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); //2. 判断是否合法 if ("xxxx".equals(username) && "123456".equals(pwd)) { //将登录成功的用户名,以cookie的形式,保存到浏览器 Cookie loginuserCookie = new Cookie("loginuser", username); //设置该cookie生命周期 loginuserCookie.setMaxAge(3600 * 24 * 3); response.addCookie(loginuserCookie); //合法 writer.println("<h1>登录OK</h1>"); } else { //不合法 writer.println("<h1>登录失败</h1>"); } writer.flush(); writer.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
Cookie 注意事项和细节
- 一个 Cookie 只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
- 一个 WEB 站点可以给一个浏览器发送多个 Cookie,一个浏览器也可以存储多个 WEB 站点提供的 Cookie。
- cookie 的总数量没有限制,但是每个域名的 COOKIE 数量和每个 COOKIE 的大小是有限制的 (不同的浏览器限制不同, 知道即可) , Cookie 不适合存放数据量大的信息。
- 注意,删除 cookie 时,path 必须一致,否则不会删除
- Java servlet 中 cookie 中文乱码
说明 如果存放中文的 cookie, 默认报错, 可以通过 URL 编码和解码来解决, 不建议存 放中文的 cookie 信息
代码解决
设置
public class EncoderCookie extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("EncoderCookie 被调用"); //1. 创建cookie, 有中文 //1) 如果直接存放中文的cookie, 报错 Control character in cookie value or attribute. //2) 解决方法,就是将中文 编程成 URL编码 英文: Encode=编码 //3) 编码后,再保存即可 String company = URLEncoder.encode("大家好", "utf-8"); Cookie cookie = new Cookie("company", company); //2. 保存到浏览器 response.addCookie(cookie); //3. 给浏览器返回信息 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println("<h1>设置中文cookie成功</h1>"); writer.flush(); writer.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
解码
public class ReadCookie2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ReadCookie2 被调用.."); //读取到中文cookie Cookie[] cookies = request.getCookies(); Cookie companyCookie = CookieUtils.readCookieByName("company",cookies); String companyVal = companyCookie.getValue(); System.out.println("companyVal= " + companyVal);//URL //解码 companyVal = URLDecoder.decode(companyVal, "utf-8"); System.out.println("解码后 companyVal= " + companyVal);//中文 //3. 给浏览器返回信息 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println("<h1>读取中文cookie解码成功~</h1>"); writer.flush(); writer.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }