目录
1 Cookie快速入门
概念:客户端会话技术,将数据保存到客户端
Cookie 使用步骤 | 1. 创建Cookie对象,绑定数据 * new Cookie(String name, String value) 2. 发送Cookie对象 * response.addCookie(Cookie cookie) 3. 获取Cookie,拿到数据 * Cookie[] request.getCookies() |
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("cookie1","hello");//1 创建Cookie对象
resp.addCookie(cookie);// 2 发送Cookie
}
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();//3 获取Cookie
if(cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+value);
}
}
}
}
Cookie实现原理:基于响应头set-cookie和请求头cookie实现
2 创建多个Cookie并发送
可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可
@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//一次创建多个Cookie并发送
Cookie cookie = new Cookie("cookie2", "www.xxx1.com");
Cookie cookie1 = new Cookie("cookie3", "www.xxx2.com");
resp.addCookie(cookie);
resp.addCookie(cookie1);
}
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();//3 获取Cookie
if(cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+value);
}
}
}
}
3 cookie保存时间
默认情况下,当浏览器关闭后,Cookie数据被销毁
持久化存储 | setMaxAge(int seconds) 1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效 |
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("cookie4", "www.xxx4.com");
//2.设置cookie的存活时间
//c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
//c1.setMaxAge(300);
//c1.setMaxAge(-1);//默认值
cookie.setMaxAge(0);//删除cookie信息
resp.addCookie(cookie);
}
4 cookie共享问题
4.1 cookie存中文
- 在tomcat 8 之前 cookie中不能直接存储中文数据。需要将中文数据转码---一般采用URL编码(%E3)
- 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
4.2 cookie共享问题
1. 假设在同一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享,如果要共享,则设置 setPath(String path):
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录,可以将path设置为"/"
@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("cookie5", "www.xxx4.com?name=张三");//存储中文数据
cookie.setPath("/");//正同一个tomcat服务器中实现数据共享
resp.addCookie(cookie);
}
}
2. 不同的tomcat服务器间cookie共享问题?
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
如 setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
5 Cookie的特点和作用
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及, 对同一个域名下的总cookie数量也有限制(20个)
Cookie作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
6 案例:记住上一次访问时间
需求:
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
分析:
1. 可以采用Cookie来完成
2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie
a 有:不是第一次访问
1. 响应数据:欢迎回来,您上次访问时间为:xxxx年x月xx日11:50:20
2. 写回Cookie:lastTime=xxxx年x月xx日11:50:20
b 没有:是第一次访问
1. 响应数据:您好,欢迎您首次访问
2. 写回Cookie:lastTime=xxxx年x月xx日11:50:20
@WebServlet("/cookieDemo6Test")
public class CookieDemo6Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/http;charset=utf-8");//1设置响应的消息体的数据格式以及编码
//2 获取所有Cookie
Cookie[] cookies = req.getCookies();
boolean flag=false;//没有名称为lastTime的cookie
//3 cookie存在则遍历Cookie数组
if(cookies!=null&&cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("lastTime".equals(name)){
flag=true;//有名称为lastTime的cookie
Date date = new Date();//获取当前时间
//日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);//日期转化为字符串形式
String encode = URLEncoder.encode(format, "utf-8");//字符串进行URL编码
cookie.setValue(encode);
cookie.setMaxAge(3600*24*30);//设置cookie存活30天
resp.addCookie(cookie);
// 获取cookie值
String value = cookie.getValue();
String decode = URLDecoder.decode(value, "utf-8");//url解码
System.out.println(decode);
resp.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+decode+"</h1>");
break;
}
}
}
//4 cookie不存在则建立cookie
if(cookies==null||cookies.length==0||flag==false){
Date date=new Date();//获取当前日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);
String encode = URLEncoder.encode(format, "utf-8");
Cookie cookie = new Cookie("lastTime",encode);
cookie.setMaxAge(3600*24*30);//设置cookie存活30天
resp.addCookie(cookie);
resp.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
}