Cookie对象
Cookie的创建与发送
/**
* Cookie的创建与发送
*/
@WebServlet("/cook01")
public class Cookie01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到Cookie对象
Cookie cookie = new Cookie("name","admin");
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie);
// 得到Cookie对象
Cookie cookie02 = new Cookie("pwd","123456");
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie02);
}
}
Cookie的获取
获取所有的cookie对象,返回cookie数组
request.getCookies();//@WebServlet("/cook02")
@WebServlet(value = {"/cook02","/cook"})
public class Cookie02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取所有的Cookie对象
Cookie[] cookies = request.getCookies();
// 判断后遍历
if (cookies != null && cookies.length > 0) {
for (Cookie cookie: cookies) {
// 获取时通过 URLDecoder.decode()来进行解码
System.out.println("name:" + URLDecoder.decode(cookie.getName()));
System.out.println("value:" + URLDecoder.decode(cookie.getValue()));
// 获取指定name的cookie对象
if ("name".equals(cookie.getName())) {
System.out.println("值为:" + cookie.getValue());
}
}
}
Cookie的失效时间
cookie默认是关闭浏览器失效(与服务器是否关闭无关)
通过maxAge设置cookie的失效时间
- 正整数
- 负整数
表示cookie只在浏览器中存活,浏览器关闭即失效.默认值是-1 - 零
表示删除cookie
@WebServlet("/cook03")
public class Cookie03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到Cookie对象
Cookie cookie = new Cookie("uname1","zhangsan");
// 正整数:表示cookie存活指定秒数。
// cookie.setMaxAge(20);
// 设置7天失效
cookie.setMaxAge(7*24*60*60);
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie);
// 得到Cookie对象
Cookie cookie02 = new Cookie("uname2","lisi");
// 负整数:表示cookie只在浏览器中存活,浏览器关闭即失效.默认值是-1
cookie02.setMaxAge(-1);
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie02);
// 得到Cookie对象
Cookie cookie03 = new Cookie("uname3","wangwu");
// 零:表示即刻删除
cookie03.setMaxAge(0);
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie03);
// 删除已有的cookie对象
Cookie cook = new Cookie("name",null);
cook.setMaxAge(0);
response.addCookie(cook);
}
Cookie的注意点
- Cookie只在当前浏览器中有效,不跨浏览器(不跨电脑)
- Cookie同名问题
在cookie的domian与path相同时,出现相同的name会覆盖 - Cookie的存储数量问题
不同的浏览器存放cookie的数量有限制,同域名下cookie的数量有限制。 - Cookie存中文问题
存中文会报错。如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码
@WebServlet("/cook04")
public class Cookie04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过 URLEncoder.encode()来进行编码
String name = URLEncoder.encode("名字");
String value = URLEncoder.encode("测试");
Cookie cookie = new Cookie(name,value);
response.addCookie(cookie);
}
}
Cookie的路径
- 在当前项目下的资源可以获取
- 在当前服务器下的资源可以获取 设置路径为"/"
- 在指定项目下的资源可以访问
- 在指定路径的资源可以访问
总结:当访问的路径中包含cookie的path时,就能获取到当前cookie对象
@WebServlet("/cook05")
public class Cookie05 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 在当前项目下的资源可以获取
Cookie cookie01 = new Cookie("a1","aa");
cookie01.setPath("/s02");
response.addCookie(cookie01);
// 2. 在当前服务器下的资源可以获取 设置路径为"/"
Cookie cookie02 = new Cookie("a2","bb");
cookie02.setPath("/");
response.addCookie(cookie02);
// 3. 在指定项目下的资源可以访问
Cookie cookie03 = new Cookie("a3","cc");
cookie03.setPath("/s01");
response.addCookie(cookie03);
// 4. 在指定路径的资源可以访问
Cookie cookie04 = new Cookie("a4","dd");
cookie04.setPath("/s02/cook");
response.addCookie(cookie04);
}
}