WEB开发会话技术02
6.Cookie的生命周期
默认情况下,Cookie只在浏览器的内存中存活,也就是说,当你关闭浏览器后,Cookie就会消失。但是也可以通过方法设置cookie的生存时间。
cookie的生命周期指的是如何管理cookie,什么时候cookie被销毁。
- setMaxAge(int expiry):设置 cookie 的最大生存时间,以秒为单位
- 整数:表示在指定的秒数后过期
- 负数:表示浏览器关闭,cookie就会被删除(默认值是-1)
- 0,表示马上删除cookie
6.1cookie生命周期expiry>0
CookieLive:
package com.li.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = {"/CookieLive"})
public class CookieLive extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieLive doPost被调用...");
//创建一个cookie,生命周期为 60s
Cookie cookie = new Cookie("job", "java");
//1.从创建改cookie开始计时,60秒后就无效
//2.由浏览器来根据创建的时间来开始计时,到时间后就认为该cookie无效
//3.如果该cookie无效了,那么浏览器在发出HTTP请求时,就不会带上该cookie
cookie.setMaxAge(60);
//将cookie保存到浏览器
response.addCookie(cookie);
//给浏览器返回信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>设置cookie生命周期成功</h1>");
writer.flush();
writer.close();
}
}
-
在浏览器中访问该servlet:
、
-
可以看到该cookie的创建于: "Sun, 20 Nov 2022 14:15:39 GMT"
真实时间为上述时间再加八小时
-
超过60s后,再去访问Tomcat服务器:
可以看到在浏览器发送的HTTP请求中的Cookie字段已经没有了设置的cookie:
说明:由浏览器来根据创建的时间来开始计时,到时间后就认为该cookie无效。如果该cookie无效了,那么浏览器在发出HTTP请求时,就不会带上该cookie。
但是此时cookie没有被删除,在关闭浏览器的时候才会被删除。
6.2演示删除cookie(expiry=0)
删除下图名为username的cookie
package com.li.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = {"/cookieLive"})
public class CookieLive extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示删除一个cookie
//1.先得到usernameCookie
Cookie[] cookies = request.getCookies();
Cookie usernameCookie =
CookieUtils.readCookieByName("username", cookies);
if (usernameCookie != null) {
//2.将其生命周期设置为0
usernameCookie.setMaxAge(0);
//3.重新保存该cookie,因为你将其生命周期设置为0,就等价于让浏览器删除该cookie
response.addCookie(usernameCookie);//在响应体的Set-Cookie
} else {
System.out.println("没有找到该cookie");
}
//给浏览器返回信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>设置cookie生命周期成功</h1>");
writer.flush();
writer.close();
}
}
redeployTomcat,浏览器访问该servlet,点击查看HTTP响应包:可以看到响应包中设置了该cookie的过期时间为1970年,这意味着浏览器将立即删除该cookie。
-
Set-Cookie: username=jack; Expires=Thu, 01-Jan-1970 00:00:10 GMT
-
点击查看cookie存储,可以发现该cookie已经被删除了
说明:setMaxAge()方法设置参数为零时,当浏览器接收到服务器的响应包时,会立即删除