JavaWeb Cookie详解
Cookie的由来
首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie。我们知道Http协议是一种无状态协议,
Web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。
即便在Http1.1支持了持续连接,但当用户有一段时间没有提交请求时,连接也会自动关闭。这时,作为Web服务器,
必须采用一种机制来唯一标识一个用户,同时记录该用户的状态。于是就引入了第一种机制:Cookie机制。
Cookie机制: 采用的是在客户端保持Http状态的方案。
Cookie的定义即基本介绍
Cookie是在浏览器访问WEB服务器的某个资源时,
由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
- 一旦WEB浏览器保存了某个Cookie,
那么它在以后每次访问该WEB服务器时,
都会在HTTP请求头中将这个Cookie回传给WEB服务器。 - 一个Cookie只能标识一种信息,
它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。 - 一个WEB站点可以给一个WEB浏览器发送多个Cookie,
一个WEB浏览器也可以存储多个WEB站点提供的Cookie。 - 浏览器一般只允许存放300个Cookie,
每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie的原理
底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,
浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
Cookie的传送过程示意图

Cookie 在JavaWeb中的使用
- Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。
- Cookie类的方法:
- 构造方法: public Cookie(String name,String value)
- getName方法
- setValue与getValue方法
- setMaxAge与getMaxAge方法
- setPath与getPath方法
- HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
- HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。
Cookie的发送
- 创建Cookie对象
- 设置最大时效
- 将Cookie放入到HTTP响应报头
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。
若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。 - 发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。
由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此将这个方法称为是addCookie,而非setCookie。
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。
Cookie的读取
- 调用request.getCookies要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,
这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。 - 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止。
会话cookie和持久cookie的区别
- 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不保存在硬盘上而是保存在内存里。 - 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
设置过期时间: setMaxAge(param) param为具体的时间,单位为秒。 - 存储在硬盘上的cookie可以在不同的浏览器进程间共享,
比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
具体实现
实现自动登录过程
//正常登录进入该页面,name是存在的
String name = request.getParameter("name");
String check = request.getParameter("checked");
if(name == null || name.equals("")){
//判断cookie存不存在
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
if(cookieName.equalsIgnoreCase("demoname")){
name = cookie.getValue();
break;
}
}
}
//不存在说明cookie过期或者非法访问,否则输出正确内容
if(name == null || name.equals("")){
response.sendRedirect("demo1.jsp");
}
else{
Cookie cookie = new Cookie("demoname",name);
cookie.setMaxAge(60);
response.addCookie(cookie);//设置持久化cookie,存储在磁盘中
out.println("hello " + name + "\n");
out.println(System.currentTimeMillis());
}
}else{
if(check != null && check.equalsIgnoreCase("on")){
Cookie cookie = new Cookie("demoname",name);
cookie.setMaxAge(60);//设置持久化cookie
response.addCookie(cookie);
}
out.println("hello " + name + "\n");
out.println(System.currentTimeMillis());
}
实现最近浏览记录功能
//把书的信息以 Cookie 方式传回给浏览器,删除一个 Cookie
//1. 确定要被删除的 Cookie: tommyyangcn开头的 Cookie数量大于或等于 5,
//且若从 books.jsp 页面传入的 book不在 tommyyangcn开头的 Cookie集合中则删除较早的那个 Cookie(tommyyangcn开头的Cookie集合的第一个 Cbookie),若在其中,则删除该 Cookie
//2. 把从 books.jsp 传入的 book 作为一个 Cookie 返回
final String cookieFinalName = "tommyyangcn";
//使用List(队列机制)存储cookie,第一个是访问时间最久的
List<Cookie> bookList = new ArrayList<Cookie>();
String bookName = request.getParameter("bookName");
out.print("欢迎在线观看:" + bookName);
Cookie[] cookies = request.getCookies();
Cookie tempCookie = null;
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
String thisCookieName = cookie.getName();
//填充cookie的存储空间
if(thisCookieName.startsWith(cookieFinalName)){
bookList.add(cookie);
}
//看当前书籍是否在cookie数组中
if(cookie.getValue().equals(bookName)){
tempCookie = cookie;
}
}
}
//说明当前书籍不在cookie数组中,则将当前书籍加入最近浏览的cookie数组中,同时删除访问时间最久的书籍,对于list集合来说,即第一个
if(tempCookie == null && bookList.size() > 0){
tempCookie = bookList.get(0);
}
//tommyyangcn开头的 Cookie数量大于或等于 5,删除需要删除的那个cookie,即tempCookie
if(bookList.size() >= 5 && tempCookie != null){
tempCookie.setMaxAge(0);
response.addCookie(tempCookie);
}
Cookie cookie = new Cookie(cookieFinalName + bookName, bookName);
response.addCookie(cookie);
How to run code
- 将代码clone到本地,使用eclipse导入代码,导入的时候项目的类型选择"git project"。
- 右键项目 run on Server。
法二: 将项目中WebContent中的内容拷入你的Tomccat服务器下的webapps目录下你建的站点名,
然后启动tomcat服务器,
在浏览器中输入: http://localhost:8080/站点名,即可访问
Tomcat目录下的webapps目录如下:

站点页面展示



项目文件结构截图
JavaWeb Cookie详解
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
JavaWeb Cookie详解的更多相关文章
- Cookie的使用、Cookie详解、HTTP cookies 详解、获取cookie的方法、客户端获取Cookie、深入解析cookie
Cookie是指某些网站为了辨别用户身份.进行session跟踪而存储在用户本地终端上的数据(通常经过加密),比如说有些网站需要登录才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我 ...
- cookie详解
一.cookie详解 (1)设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId ...
- ASP.NET 操作Cookie详解 增加,修改,删除
ASP.NET 操作Cookie详解 增加,修改,删除 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它 ...
- 网络基础 cookie详解
cookie详解 by:授客 QQ:1033553122 cookie干嘛用的? 参见文章http 会话(session)详解: 网络基础 http 会话(session)详解 cookie分类 ...
- cookie详解(含vue-cookie)
今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9Ekm0u33w 原文如下,记录到此供以 ...
- Session和Cookie详解(1)
面试常问的有关session和cookie的问题: 1.session在分布式环境下怎么解决 2.集群下如何保证session踩中 3.cookie的大小 4.服务器怎么识别一个用户的 5.sessi ...
- Cookie 详解以及实现一个 cookie 操作库
Cookie 详解以及实现一个 cookie 操作库 cookie 在前端有着大量的应用,但有时我们对它还是一知半解.下面来看看它的一些具体的用法 Set-Cookie 服务器通过设置响应头来设置客户 ...
- [转]Cookie详解
从事 Web 开发已有近17个月:在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感-差不多是了解一二,然而又非真切的明晰:这就使得再用的时候,总要去再搜索一番:如此颇为难受,倒不 ...
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...
随机推荐
- C++编程见闻
今天心血来潮,看到很多天借的一本书<轻松学C++编程>,书就一般,但是由于自己的刚开始学c++,勉强凑活来看吧,就把学习的过程亮出来,权且对自己的一种变相激励也好. 程序一 首先:打开vi ...
- Android studio配置使debug签名和release签名一致
在module的build.gradle中添加 android { //重要部分 signingConfigs { release { keyAlias 'jxt' keyPassword '1234 ...
- ios控件渐变色的处理
+(CAGradientLayer *)gradientColorWithBounds:(CGRect)bounds startColorHexString:(NSString *)startColo ...
- Codeforces Gym100952 C. Palindrome Again !!-回文字符串 (2015 HIAST Collegiate Programming Contest)
C. Palindrome Again !! time limit per test 1 second memory limit per test 64 megabytes input sta ...
- Codeforces Round #377 (Div. 2) A. Buy a Shovel【暴力/口袋里面有无限枚 10 元和一枚 r 面值的硬币,问最少可以买多少把价值为 k 的铁铲】
A. Buy a Shovel time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 中矿大新生赛 G 甄总搬石头【优先队列/哈夫曼/贪心】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 https://www.nowcoder.com/ ...
- luogu P1195 口袋的天空
题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...
- POJ 2566:Bound Found(Two pointers)
[题目链接] http://poj.org/problem?id=2566 [题目大意] 给出一个序列,求一个子段和,使得其绝对值最接近给出值, 输出这个区间的左右端点和区间和. [题解] 因为原序列 ...
- android xml 布局文件中 android:ems="10"
宽度为10个字符的宽度 xml中 android:ems属性 ,作为EditText 默认生成 的属性,其含义是需要编辑的 字符串长度 .设置为10时,最多编辑 10个em ,一个em单位是 两个in ...
- JavaScript传递变量:值传递?引用传递?
今天在看 seajs-2.2.1/src/util-events.js源码,里面有段代码不是很理解: var events = data.events = {} // Bind event seajs ...