文档章节

JavaEE细节问题05——Cookie和Session

Lunqi
 Lunqi
发布于 2015/08/17 21:36
字数 1485
阅读 252
收藏 11


Cookie和Session的作用:

都是用于存储一些关键数据。

Cookie和Session的存储位置:

Cookie储存在客户端,Session储存在服务器


Cookie的产生和销毁以及原理:

Cookie由服务器产生,通过HTTP协议发送给客户端。

在协议的响应头中的:Set-Cookie标注了这个cookie的信息

下次如果有cookie带给服务器时,将会在

在协议的请求头中的:Cookie标注了这个cookie的信息:

/*
 * 正值表示 cookie 将在经过该值表示的秒数后过期。注意,该值是 cookie 过期的最大 生存时间, 不是
 * cookie的当前生存时间。 负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除。0 值会导致删除cookie
*/
cookie.setMaxAge(Integer.MAX_VALUE);

        删除Cookie注意:由于在Http协议中请求发送Cookie的时候只是带有Cookie的名称和值,但是一个Cookie的唯一标识是Cookie的名称+domain+path。所以我们在删除Cookie的时候为了能真正把原来的Cookie的MaxAge改成0的话,就必须要设置这个Cookie的domain和path,设置的要与之前发送Cookie时一样。也就是说,发送时怎么设置的Cookie的path和domain那么要删除这个cookie的时候也要这么设置!!


Cookie的属性和特点:

// 创建cookie的时候,就将一个字符串类型的k-v值传入,一个cookie只能由一个k-v
Cookie cookie = new Cookie("keyyy", "valueeee");
/*
 * 指定一个描述 cookie 用途的注释。如果浏览器向用户显示 cookie,则注释很有用。 Netscape Version 0
 * cookie 不支持注释。
 */
cookie.setComment("testCook");
/*
 * RFC 2109 指定了域名的形式。域名以点 (.foo.com) 开头,意味着在指定域名系统(Domain Name
 * System,DNS)区域中(例如,www.foo.com,但不是 a.b.foo.com)cookie
 * 对于服务器是可见的。默认情况下,cookie 只返回给发送它们的服务器。 
 * pattern 包含域名(在其中此 cookie 可见)的String;域名形式符合 RFC 2109
 */
//cookie.setDomain("");
/*
 * 正值表示 cookie 将在经过该值表示的秒数后过期。注意,该值是 cookie 过期的最大 生存时间, 不是
 * cookie的当前生存时间。 负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除。0 值会导致删除 cookie。
 */
cookie.setMaxAge(Integer.MAX_VALUE);
/*
 * 指定客户端应该返回 cookie 的路径。 cookie 对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的。cookie
 * 的路径必须包括设置 cookie 的 servlet,例如 /catalog,它使 cookie 对于服务器上 /catalog
 * 下的所有目录都是可见的。默认状态是当前发送cookie的这一个servlet的同级目录
 */
//cookie.setPath("");
/*
 * 指示浏览器是否只能使用安全协议(如 HTTPS 或 SSL)发送 cookie。 默认值为 false。 flag 如果为
 * true,则仅在使用安全协议时将 cookie 从浏览器发送到服务器;如果为 false,则在使用任何协议时都可以发送
 */
cookie.setSecure(false);
/*
 * 在创建 cookie 之后将新值分配给 cookie。如果使用二进制值,则可能需要使用 BASE64 编码。 对于 Version 0
 * cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。
 * 空值在所有浏览器上的行为不一定相同。
 */
cookie.setValue("vvv");
/*
 * 设置此 cookie 遵守的 cookie 协议版本。版本 0 遵守原始 Netscape cookie 规范。版本 1 遵守 RFC
 * 2109。
 */
cookie.setVersion(1);
//发送这个cookie
response.addCookie(cookie);






Session的产生和销毁以及原理:

首先Session作用与一次回话。什么是会话?就是打开浏览器到关闭浏览器

Session由服务器产生(准确的说是request.getSession()方法产生),产生后将通过Cookie(没有的话就创建一个)

给客户端发送一个带有JSESSIONID参数和值的一个键值。这个cookie没有设置销毁时间,也就是说这个cookie的销毁时间是默认的(一次会话,也就是直到浏览器关闭)

有一点需要注意,由于打开多个相同浏览器窗口能够共享这个Cookie,所以同种浏览器在不全部关闭的前提下打开多个窗口是能够共享到这一个Cooie的!!!!!

JSESSIONID就是当前这个会话代表的Session在服务器内存中的一个区域的标识,在一个会话中每次发出请求时都带有这个Cookie,通过Cookie中的这个JSESSIONID标识就能定位到服务器中这个Session。

在服务器中有一块内存区域是存放客户端的Session域,当浏览器关闭,存放JSESSIONID的Cookie丢失,这时候只是浏览器找不到了服务器中属于自己的Session区域,而不是服务器中的Session真正的销毁!


Session实例:



Session的属性和特点:

Session的创建:


/*
 * 获取到当前的session
 * getSession()与getSession(true)用法相同!:    如果当前有session,则返回当前的session,如果没有,就创建一个
 * getSession(false):    当前没有session,也不创建新的session
 */
HttpSession session  = req.getSession();


Session是一个域,可以存放对象,作用范围是一次会话。


关于对象的存取不说了,这里说说关于对象的移除。


很多人会用session.invalidate()来删除session,这样session域中的对象也就没了,但是这样不好。

第一个是会伤及无辜,为了删除对象a,结果b,c,d也全都没了。第二个是会浪费资源,因为每次直接删除

session,那么在本次回话的下次请求时又得建立新的session。


也有使用removeAttribute(key);这样的方式来移除对象的,这样比较好。






© 著作权归作者所有

Lunqi

Lunqi

粉丝 41
博文 35
码字总数 29786
作品 1
杭州
程序员
私信 提问
加载中

评论(7)

Lunqi
Lunqi 博主

引用来自“CanyellWang”的评论

牛逼啊。 多写点。 我基本天天看一会。

这个还得改,还有点写的不全
CanyellWang
CanyellWang
牛逼啊。 多写点。 我基本天天看一会。
Lunqi
Lunqi 博主

引用来自“alexDevlin”的评论

如果打开一个网站后,然后再右键点击里面的随便一个链接选择打开新的选项卡,用的是同一个session么

引用来自“Lunqi”的评论

引用来自“alexDevlin”的评论

如果新选项卡中退出登录,原选项卡会有什么变化
得看具体实现,要看服务器段是如何实现退出登录的功能的,如果是直接删除session,那么在原选项卡一刷新的时候,服务器端又会产生一个;如果是删除session中的user对象的话,那么就算新选项卡关闭,退出登录之后,session还是存在
Alexdevlin
Alexdevlin

引用来自“alexDevlin”的评论

如果打开一个网站后,然后再右键点击里面的随便一个链接选择打开新的选项卡,用的是同一个session么

引用来自“Lunqi”的评论

如果新选项卡中退出登录,原选项卡会有什么变化
Lunqi
Lunqi 博主

引用来自“alexDevlin”的评论

如果打开一个网站后,然后再右键点击里面的随便一个链接选择打开新的选项卡,用的是同一个session么
Lunqi
Lunqi 博主

引用来自“alexDevlin”的评论

如果打开一个网站后,然后再右键点击里面的随便一个链接选择打开新的选项卡,用的是同一个session么
是的
Alexdevlin
Alexdevlin
如果打开一个网站后,然后再右键点击里面的随便一个链接选择打开新的选项卡,用的是同一个session么
Servlet 工作原理解析

该文深入的介绍了 J2EE 中使用最广泛的 Servlet 技术运行原理,不管对于初学者还是高手来说都非常值得一看。 从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与...

红薯
2011/02/25
8.4K
10
response.encodeURL的用法

Java Servlet API 中引用 Session 机制来追踪客户的状态。Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。当一个 Session 开始时,Servlet 容器...

阿秀a
2010/10/17
0
0
走进JavaWeb技术世界4:Servlet 工作原理详解

本文出自我的公众号:程序员江湖。 满满干货,关注就送。 从本篇开始,正式进入Java核心技术内容的学习,首先介绍的就是Java web应用的核心规范servlet 转自:https://www.ibm.com/developer...

你的猫大哥
2017/09/22
0
0
初学 Java Web 开发,请远离各种框架,从 Servlet 开发

OSCHINA 软件库有一个分类——Web框架,该分类中包含多种编程语言的将近500个项目。 Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践。很多Web框架是从实际的Web项目抽...

红薯
2012/05/03
398.9K
316
Java Servlet工作原理问答

导读 本文来自stackoverflow的问答,讨论了Java Servlet的工作机制,如何进行实例化、共享变量和多线程处理。 问题:Servlet是如何工作的?Servlet 如何实例化、共享变量、并进行多线程处理?...

LCZ777
2015/11/05
131
0

没有更多内容

加载失败,请刷新页面

加载更多

006-Docker中导出单个或多个tar包

docker中导出单个镜像和多个镜像的tar包 docker save [images] > [name.tar] docker save [images] [images] > [name.tar]...

伟大源于勇敢的开始
今天
6
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
6
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
5
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部