JavaEE细节问题05——Cookie和Session
2015-08-17 21:36
267 查看
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);这样的方式来移除对象的,这样比较好。
相关文章推荐
- Spring MVC 教程,快速入门,深入分析
- java 之 语言基础
- JavaEE细节问题04——Servlet细节问题
- Eclipse的JS编辑器响应慢,复制和粘贴时很卡的解决方法
- 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
- Java Concurrency in Practice——LogService
- 在Java中使用transient
- 基于注解的 Spring MVC 简单入门
- vv_jeffy之spring4.x集成myibatis3.x
- 面向问题编程——Java泛型
- Eclipse初体验
- java双缓冲 笔记
- Spring学习笔记-springMVC基于注解的控制器(Demo)
- 谈谈Java中的集合
- Java学习笔记(十二):泛型的使用
- 关于java的设计目标
- Java线程:线程状态的转换
- Java陷阱之assert关键字
- java如何正确停止一个线程
- 一致性哈希算法学习及JAVA代码实现分析