一、cookie简介
将数据存储在客户端,每次向服务器端发请求时都将存在客户端的数据随着请求发送到服务器端,修改后再发回到客户端保存的这种模式叫做Cookie。
二、cookie的特点和作用
2.1、特点
- cookie存储数据在客户端浏览器;
- 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)。
2.2、作用
- cookie一般用于存出少量的不太敏感的数据;
- 在不登录的情况下,完成服务器对客户端的身份识别。
三、cookie的实现原理
- 如果客户端向服务器端发送请求,遇到创建Cookie的代码时,那么一小段文本信息就会随着response响应中的头信息被传递会客户端;
- 当文本信息到达客户端以后,会被保存在客户端的内存或硬盘上,存在内存中会随着内存的释放而消失,存在硬盘上则会保存更长的时间;
- 当浏览器再次向服务器发起请求时,存储的文本信息会随着请求数据包的消息头以Cookie形式将文本信息发送到服务器端;
- 只要Cookie的生命周期没有结束,那么不管是存在内存还是硬盘上的信息都会在客户端向服务器端发出请求时自动的随着消息头发送过去。
四、cookie的功能
package com.wedu.demo.servlet;
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;
import java.io.IOException;
/**
* Cookie的使用
*/
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg","hello");
//1、public void setPath(String uri):设置cookie的获取范围
cookie.setPath("/");//设置path,让当前服务器下部署的所有项目共享Cookie信息
//2、public void setMaxAge(int expiry):设置cookie的保存时间,正数,cookie写入到硬盘;负数,默认值;0,删除cookie信息
cookie.setMaxAge(30);
//3、发送cookie对象
response.addCookie(cookie);
//4、获取cookie对象
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie1 : cookies) {
//5、public String getName():获取cookie的名字
String name = cookie1.getName();
//6、public String getValue():获取cookie的值
String value = cookie1.getValue();
System.out.println(name + ":" + value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
五、cookie的注意点
1、cookie的保存时间
- 默认情况下,当浏览器关闭后,Cookie数据被销毁;
- 如果要更改保存的时间的话,可以使用setMaxAge(int expiry)设置保存的时间。
2、cookie编码和解码
- 编码:将需要存储的数据按照指定格式进行存储,可以使用URLEncoder.encode(String s,String enc)进行编码;
- 解码:将需要读取的数据通过指定的格式解析,可以使用URLDecoder.decode(String s, String enc)进行解码。
3、cookie数据共享
- 在同一个服务器下,多个web项目默认情况下cookie不能共享,如果需要共享数据可以通过setPath(String path)方法设置cookie的获取范围。
- 在不同的服务器下,如果需要共享cookie数据,可以使用setDomain(String path)方法设置一级域名相同,则多个服务器之间cookie可以共享。
六、cookie的应用案例
package com.wedu.demo.servlet;
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;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* cookie实例
*/
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1.获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie为lastTime
//2.遍历cookie数组
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
//3.获取cookie的名称
String name = cookie.getName();
//4.判断名称是否是:lastTime
if("lastTime".equals(name)){
//有该Cookie,不是第一次访问
flag = true;//有lastTime的cookie
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
//响应数据
//获取Cookie的value,时间
String value = cookie.getValue();
System.out.println("解码前:"+value);
//URL解码:
value = URLDecoder.decode(value,"utf-8");
System.out.println("解码后:"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
if(cookies == null || cookies.length == 0 || flag == false){
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
Cookie cookie = new Cookie("lastTime",str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24);//一天
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}