客户端收到cookie之后,下次访问服务器会默认带上cookie。但是,如果客户端重启之后,再次访问服务器,cookie就没有了。
这是因为cookie默认级别是会话级别。如果想让cookie变得更久该怎么办呢?
一、设置Cookie在客户端的持久化时间
cookie.setMaxAge(int seconds); ---时间秒
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里。不同的浏览器的cookie持久化的地方是不一样的。
如果不定义cookie的过期时间,那么cookie 的过期时间就会是会话期间,也就是说,此时的cookie是和sesstion等效的,唯一的不同是此种cookie是存储在客户端的内存中,Session是存储在服务器端的内存中。
不设置expire就是内存cookie,关闭浏览器自动删除。设置expire会在客户端生成cookie文件,过期才会删除。
示例:
cookie.setMaxAge(10*60);
设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息
实例:
package com.ken.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SendCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.创建cookie对象
Cookie cookie = new Cookie("name", "zhangsan");
// 1.1 为cookie设置持久化时间--------cookie信息在硬盘上保存的时间
cookie.setMaxAge(50);// 50秒
// 2.将cookie中存储的信息发送到客户端----头
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
首先,我们访问sendCookie这个servlet
我们先关闭浏览器,然后访问静态资源:
cookie的name和value都存在。
过了50秒后,我们访问静态资源:
二、设置Cookie的携带路径
cookie.setPath(String path);
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
示例:
cookie.setPath("/WEB16");
代表访问WEB16应用中的任何资源都携带cookie
cookie.setPath("/WEB16/cookieServlet");
代表访问WEB16中的cookieServlet时才携带cookie信息
实例:
package com.ken.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SendCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.创建cookie对象
Cookie cookie = new Cookie("name", "zhangsan");
// 1.1 为cookie设置持久化时间--------cookie信息在硬盘上保存的时间
cookie.setMaxAge(50);// 50秒
// 1.2为cookie设置携带的路径
cookie.setPath("/cookieDemo/sendCookie");// 访问sendCookie资源时才携带这个cookie
// 2.将cookie中存储的信息发送到客户端----头
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
先访问sendCookie
再访问静态资源:
再访问sendCookie:
package com.ken.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SendCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.创建cookie对象
Cookie cookie = new Cookie("name", "zhangsan");
// 1.1 为cookie设置持久化时间--------cookie信息在硬盘上保存的时间
cookie.setMaxAge(50);// 50秒
// 1.2为cookie设置携带的路径
cookie.setPath("/cookieDemo/sendCookie");// 访问sendCookie资源时才携带这个cookie
// cookie.setPath("/cookieDemo");// 访问cookieDemo下的任何资源都才携带这个cookie
// cookie.setPath("/");// 访问服务器下的任何资源都才携带这个cookie
// 2.将cookie中存储的信息发送到客户端----头
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
三、删除客户端的cookie:
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可