JavaWeb——会话技术之Cookie快速入门与案例实战(详细讲解了Cookie实现原理、Cookie使用细节、Cookie的特点及作用)
1 会话技术概述
会话与生活中的谈话很类似,有开始,有结束,中间过程一问一答。一次会话中包含多次请求和响应:
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开;
- 功能:在一次会话的范围内的多次请求间来共享数据(比如:京东点击多个加入购物车,然后去购物车结算就用到了);
- 方式:1)客户端会话技术Cookie; 2)服务器端会话技术Session;
2 客户端会话技术Cookie
Cookie是将数据保存到客户端的一种客户端会话技术,比如,上节中提到的京东购物,点击一次加入一次购物车,这是一次请求,浏览器就会将获取的数据保存在本地。
2.1 快速入门
使用步骤如下:
- 1)创建Cookie对象,绑定数据:new Cookie(String name, String value)
- 2)发送Cookie对象:response.addCookie(Cookie cookie)
- 3)获取Cookie,来拿到数据:Cookie[] request.getCookies()
【举例】:写两个Servlet,代码如下,测试时,先打开浏览器分别访问Demo1和Demo2,我们可以看到后台打印出Cookie数据,但是关闭浏览器,再次访问Demo2,就不能获取到数据了。
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建Cookie对象
Cookie c = new Cookie("msg","hello");
//2、发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3、获取Cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.2 实现原理分析
Cookie实质上就是基于响应头set-cookie和请求头cookie实现的。
2.3 Cookie使用细节
cookie的使用涉及几个细节问题:
1、一次是否可以发送多个cookie?
可以,创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","world");
//2、发送Cookie
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2、cookie在浏览器的保存时长?
- 默认情况下,当浏览器关闭后Cookie数据被销毁;
- 可以设置cookie,使其持久化存储,setMaxAge(int seconds),参数为: 正数:将Cookie数据写到硬盘文件中,数值大小表示了cookie存活时间; 负数:默认值; 零:删除Cookie数据;
//1、创建Cookie对象
Cookie c = new Cookie("msg","setMaxAge");
c.setMaxAge(30); //cookie持久化存储30s后自动删除
//2、发送Cookie
response.addCookie(c);
3、cookie能不能存储中文?
- Tomcat8之前,cookie中不能存储中文数据,会报错,在Tomcat8之后,cookie支持中文数据,但对于特殊还是不支持,建议使用URL编码存储,使用URL解码解析;
- 若是Tomcat8之前的,需要将中文数据转码,一般采用URL编码(%E3这种格式)
4、cookie的共享问题?
1)假设在同一个Tomcat服务器中部署 了多个web项目,那么这些web项目的cookie能否共享?
- 默认情况下是不能共享的;
- 通过setPah(String path)可以设置cookie的获取范围,默认情况下是当前的虚拟目录,若要共享,可设置为“/”;
2)不同的Tomcat服务器间的共享问题
setDomain(String path):设置一级域名相同,那么多个服务器之间的cookie就可以共享了,比如:setDomain(".baidu.com"),则tieba.baidu.com中的cookie就可以共享了。
2.3 Cookie的特点及作用
【特点】:
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie的大小有限制,且对同一域名下的总cookie数量也有限制(20个)
【作用】:
- cookie一般用于存储少量的不太敏感的数据;
- 在不登录的情况下来完成服务器对客户端的身份识别(如不登录百度账号,设置百度,下次再次打开百度首页后设置仍有效);
3 Cookie案例实战
【案例】:记住上一次的访问时间
【需求】:访问一个servlet,若是第一次访问,则提示:您好,欢迎您首次访问;若不是,则提示:欢迎回来,您上次访问时间为:显示时间字符串。
【分析】:
【代码实现】:如下,注意Cookie有特殊字符时需要进行URL编解码,否则会报错
@WebServlet("/CookieTest")
public class CookieTest 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;
if(cookies!= null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("lastTime".equals(name)){
flag = true;
//设置Cookie,时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
time = URLEncoder.encode(time,"utf-8"); //URL编码,否则会报错
cookie.setValue(time);
//设置存活时间
cookie.setMaxAge(60*60*24*30);//一个月
response.addCookie(cookie);
//响应数据
String value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
if(cookies ==null || cookies.length==0 || flag==false){
//设置Cookie,时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
time = URLEncoder.encode(time,"utf-8");
Cookie cookie = new Cookie("lastTime",time);
//设置存活时间
cookie.setMaxAge(60*60*24*30);//一个月
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!
- 轻松水印-批量提取exif信息加水印的工具
- Enterprise Library 4.1学习笔记7----缓存应用程序块之SqlDependency
- linux运维中的命令梳理(一)
- 可视化你的BLAST结果
- linux运维中的命令梳理(二)
- VB-取日期属于星期几
- 全球AI新闻创新实践系列③:华邮、雅虎、美联社、Quartz怎么干!
- nginx+php负载均衡集群环境中的session共享方案梳理
- PowerPoint发布及链接图片的处理
- EXCEL单元格的引用方式
- SqlDependency学习笔记
- linux系统下对网站实施负载均衡+高可用集群需要考虑的几点
- 运维利器-ClusterShell集群管理操作记录
- img标签的src=""会引起的Page_Load多次执行
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 重发和重定向有什么区别与重定向应用
- 为tinycolinux制作应用包
- CrossC2的2.0版本
- 使用OpenCV和Python计算图像的“色彩”
- 为tinycolinux创建应用包-toolchain和编译方法
- [译]在Solidity中如何优化Gas第一部分:变量
- [译]Solidity 0.7.0 新变化
- 两个数组的交集 II
- 常说的手机刷新率60Hz、120Hz有什么不同?
- Istio 运维实战系列(3):让人头大的『无头服务』-下
- java安全编码指南之:可见性和原子性
- java安全编码指南之:敏感类的拷贝
- 测试面试题集-MySQL数据库灵魂拷问
- Linux提权姿势一:滥用SUDO提权
- Linux提权姿势二:利用NFS提权