(12)Cookie对象介绍与使用

(12)Cookie对象介绍与使用

一、Cookie介绍:

  HTTP协议时没有记忆的,一次请求结束后,相关的数据就销毁没了。如果第二次请求的时候需要使用相同的数据,难道需要再写一下请求一下吗?比如你登录后,每一次页面点击都需要登录这多麻烦。

  也就是说如果需要保存一下用户的请求数据该怎么解决呢?

1.作用

  使用Cookie,解决了不同请求间的数据共享问题。

  我们把请求需要的共享的请求数据存储再浏览器端,避免用户进行重复的数据书写操作。

  Cookie技术是浏览器端的数据存储技术。解决了不同请求需要使用相同的请求数据的问题。

2.特点:

  • 不安全
  • 适合存储键值对形式的少量数据
  • 他是浏览器端的数据存储技术,但存储的数据声明在服务器端。

3.注意:

  • 设置多个Cookie存储
    一个Cookie对象存储一条数据。如果需要存储多条数据,可以多new几个Cookie对象进行存储。以下是创建Cookie的形式
Cookie c1 = new Cookie("key1", "value1");
Cookie c2 = new Cookie("key2", "value2");
  • 设置Cookie存储的时间
    临时存储:不设置 cookie 信息的存储时间,则该Cookie生命周期为一次会话,存储在浏览器内存中。浏览器关闭时Cookie失效。
    定时存储:设置了Cookie的有效期,存储在用户的电脑硬盘中。在有效期内,符合路径要求的请求都会附带该Cookie信息。
c2.setMaxAge(60*5); // 存储5分钟,5分钟后这个Cookie失效。60秒*5
  • 设置什么路径下携带该Cookie信息。不设置默认是每次请求都会携带
c2.setPath("/"); // 在此路径下都带上c2这个Cookie信息

备注:重启服务器Cookie信息是不会失效的,因为Cookie是存放在浏览器端的。如果你在测试时Cookie信息一直在。你可以将浏览器的缓存清除一下。

二、Cookie的简单使用:

1.Cookie创建

  • 代码
import java.io.IOException;

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;

/**
 * Cookie学习:Cookie解决了不同请求的数据共享问题。
 * 
 * @author changsheng
 */
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		// 4.处理请求信息
		Cookie c1 = new Cookie("temporaryUsername", "Zhangsan"); // 临时存储:将请求中的temporaryUsername参数存放到cookie中
		Cookie c2 = new Cookie("timingKey", "5minutes"); // 定时存储:将请求中的timingKey参数存放到cookie中
		c2.setMaxAge(60*5); // 存储5分钟,5分钟后这个Cookie失效。60秒*5
		c1.setPath("/"); // 在此路径下都带上c1这个Cookie信息
		c2.setPath("/"); // 在此路径下都带上c2这个Cookie信息
		// 5.响应处理结果
		resp.addCookie(c1); //  响应Cookie信息c1给客户端
		resp.addCookie(c2); //  响应Cookie信息c2给客户端
		resp.getWriter().write("Cookie学习!");
	}
	
  • 运行
    访问CookieServlet(Servlet),此时会显示已经设置了Cookie信息在这里面。分别是temporaryUsername和timingKey。

响应处理结果时,代码中不要忘记加这两行

resp.addCookie(c1); //  响应Cookie信息c1给客户端
resp.addCookie(c2); //  响应Cookie信息c2给客户端

在这里插入图片描述

如果此时随便打一个路径还是可以看到Cookie信息。
在这里插入图片描述
假设此时关闭了浏览器,然后重新打开这个随便打的网站,则没有设置时间的Cookie会消失。

==原因==:
  没有设置有效时间的Cookie是存储在浏览器的运行内存中的,浏览器关闭的时候就失效了。
  设置了有效时间的Cookie是存储在客户端的硬盘中的。在有效期内,符合路径要求的请求都会附带上这个Cookie信息。

设置Cookie有效期代码:

Cookie c2 = new Cookie("timingKey", "5minutes"); // 定时存储:将请求中的timingKey参数存放到cookie中
c2.setMaxAge(1000*60*5); // 存储5分钟,5分钟后这个Cookie失效

在这里插入图片描述
如果设置的Cookie有效期时间到了,那么Cookie信息也就失效了。Cookie也会消失。
在这里插入图片描述
如果此时你再次重新访问了 /CookieServlet那么又会重新增加Cookie。就又有Cookie信息了!

2.Cookie获取

使用如下代码获取所有Cookie信息,然后遍历一下即可。

Cookie[] cookies = req.getCookies(); // 获取所有Cookie信息

访问 /GetCookieDataServlet即可获取所有Cookie信息

import java.io.IOException;

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;

/**
 * Cookie学习:获取所有Cookie信息
 * 
 * @author changsheng
 */
@WebServlet("/GetCookieDataServlet")
public class GetCookieDataServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		// 4.处理请求信息
		StringBuilder out = new StringBuilder(); // 存放所有Cookie信息
		Cookie[] cookies = req.getCookies(); // 获取所有Cookie信息
		if (null != cookies) { // 如果不为空则遍历
			for (int i = 0; i < cookies.length; i++) {
				out.append(cookies[i].getName()+":"+cookies[i].getValue()+"\n");
			}
		}
		// 5.响应处理结果
		System.out.println("所有Cookie信息为:\n"+out);
		resp.getWriter().write("所有Cookie信息为:\n"+out);
	}
	
}