`
he_lux
  • 浏览: 102824 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

会话COOKIE? 持久COOKIE?

    博客分类:
  • JAVA
阅读更多
关于COOKIE和SESSION的关系,一直没搞清楚。网上一搜COOKIE,普遍都有会话COOKIE和持久COOKIE的概念。

rubyeye的博客里有这样的解释,我把部分贴过来。(http://rubyeye.iteye.com/blog/196117

引用
当浏览器得到这个sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
   可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
   上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
   如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就是URL重写只能实现会话cookie的效果,持久会话实现不了.


刚开始理解时,我也认为会有持久和会话这两种COOKIE。我认为,
会话COOKIE就是用来存放SESSIONID的,并且只存在于浏览器内存,浏览器关闭后会话COOKIE就被删除;
持久COOKIE就是用来存放其它信息,并且是在我们的本地硬盘里能看到的那种COOKIE。

然后我写了个SERVLET试了一下。
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
	
	Cookie cookie = null;
	
	PrintWriter out = response.getWriter();
	out.println("<html><body>");
	
	Cookie[] cookies = request.getCookies();
	
	// 如果没有COOKIE,新建一个COOKIE
	if (cookies == null) {
		
		out.println("<b>cookies is null.</b></br>");
		
		cookie = new Cookie("new", "1");
		
		response.addCookie(cookie);
		
	} else {
		
		out.println("<b>cookies is not null.</b></br>");
		
		for (int i = 0; i < cookies.length; i++) {
			
			cookie = cookies[i];
			
			out.println("cookie" + i + " name: " + cookie.getName() + "</br>");
		}
	}
	
	HttpSession session = request.getSession();
	
	if (session == null) {
		out.println("<b>session is null.</b></br>");
		
	} else {
		out.println("<b>session is not null.</b></br>");
		out.println("session id: " + session.getId() + "</br>");
	}
	
	out.println("</body></html>");
}


第一次访问这个SERVLET,页面显示
引用
cookies is null.
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


第二次访问,页面显示
引用
cookies is not null.
cookie0 name: new
cookie1 name: JSESSIONID
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


第二次访问时从客户端来了两个COOKIE,名为“new”的COOKIE是我创建的,名为“JSESSIONID”的COOKIE应该是服务器TOMCAT创建的,但这时,在本地硬盘里找不到这两个COOKIE的文件。

改一下SERVLET,在创建名为“new”的COOKIE时,加一句
cookie.setMaxAge(1000);

然后本地硬盘里就有“new”这个COOKIE了。

这下就有疑问了,在没有设置COOKIE存活期时,自己创建的SESSION不会存到本地硬盘,会不会TOMCAT创建的所谓的会话COOKIE也是没有设置存活期呢?

然后根据zddava的博客(http://zddava.iteye.com/blog/311053),找到了TOMCAT里创建会话COOKIE的代码。

org.apache.catalina.connector.Request.java里,
protected void configureSessionCookie(Cookie cookie) {
    cookie.setMaxAge(-1);
    String contextPath = null;
    if (!connector.getEmptySessionPath() && (getContext() != null)) {
        contextPath = getContext().getEncodedPath();
    }
    if ((contextPath != null) && (contextPath.length() > 0)) {
        cookie.setPath(contextPath);
    } else {
        cookie.setPath("/");
    }
    if (isSecure()) {
        cookie.setSecure(true);
    }
}

cookie.setMaxAge(-1);使COOKIE在浏览器被关闭时删除。而且这里的cookie和上面SERVLET里的cookie都是javax.servlet.http.Cookie。

由此得出结论,可能最开始是我理解错了,COOKIE并没有会话COOKIE和持久COOKIE之分。我们本地创建的“持久COOKIE”和WEB容器创建的“会话COOKIE”都是一种COOKIE,就是javax.servlet.http.Cookie。只是WEB容器把存活期设置成了关闭浏览器时删除而已(TOMCAT)。
8
0
分享到:
评论
3 楼 maoxiaoyun 2013-04-17  
    /**
     * Sets the maximum age of the cookie in seconds.
     *
     * <p>A positive value indicates that the cookie will expire
     * after that many seconds have passed. Note that the value is
     * the <i>maximum</i> age when the cookie will expire, not the cookie's
     * current age.
     *
     * <p>A negative value means
     * that the cookie is not stored persistently and will be deleted
     * when the Web browser exits
. A zero value causes the cookie
     * to be deleted.
     *
     * @param expiry an integer specifying the maximum age of the
     * cookie in seconds; if negative, means the cookie is not stored;
     * if zero, deletes the cookie
     *
     * @see #getMaxAge
     */
    public void setMaxAge(int expiry) {
        maxAge = expiry;
    }

Jdk源码说明了,当maxAge=-1时,浏览器退出时会删除该cookie,在浏览器端,max-age用秒来设置cookie的生存期。
2 楼 suuuuun1987 2012-03-19  
1 楼 hustlxjaw 2011-03-01  
好文章,谢谢作者了

相关推荐

    经典收藏Cookie和Session

    一、cookie机制和session机制的区别 ...... 二、会话cookie和持久cookie的区别 ......

    一篇文章搞定iOS的Cookie存取

    Cookie可以分为两类,会话Cookie和持久Cookie,会话Cookie是临时Cookie,当前会话结束(浏览器退出)时Cookie会被删除。持久Cookie会存储在用户的硬盘上,浏览器退出,然后重新启动后Cookie仍然存在。会话Cookie和持久...

    WEB16-session&cookie-源代码.rar

    注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里 示例: cookie.setMaxAge(10*60); ...

    六大对象Response,Request,Server,Application,Session,Cookie

    在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。 Session即会话,是指一个用户在一...

    session与cookie

    一种是会话性质的cookie,存放在浏览器内存中,当你在用代码向客户端写入cookie的时候,如果没有指定过期时间,那么cookie是存放在浏览器的内存里面的,不会持久化在硬盘上,也就是你在浏览器的临时文件里找不到!...

    会话:软件包gorillasessions为自定义会话后端提供cookie和文件系统会话以及基础结构

    切换会话持久性(又称“记住我”)和设置其他属性的便捷方法。 旋转身份验证和加密密钥的机制。 每个请求有多个会话,即使使用不同的后端也是如此。 自定义会话后端的接口和基础结构:可以使用通用API检索并批量...

    Cookie用法大全

    Cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持久地保持数据。Request和Response对象都有一组Cookie。Request.cookie集合是一系列Cookie,从客户端与...

    kisso单点登录

    1、session 存放在服务器端,cookie 存放在客户端,存在两种状态:“ 第一种:持久 cookie 具有时效性,以文件的形式存放在客户机硬盘中,时间一到生命周期结束自动被删除。第二种:临时 cookie 又叫会话 cookie 放在...

    nginx cookie有效期讨论小结

    每一次访问都会在浏览器生成Cookie,那么Cookie的存在对于用户来说是好还是坏呢?...这种保持可能是基于会话Session的,也有可能是持久性的。然而不管哪一种,身份认证Cookie中包含的服务端票据Ticket一旦泄露,那么服

    Java Web应用开发:Servlet和JSP技术进阶.ppt

    如: 都属于非持久化会话方案 都使用页面动态修改技术,因此不支持静态HTML 代码编写方式很相似 Cookie技术 什么是Cookie? 一些网站会在您的计算机上的以小文本文件存储信息。这种文件称为cookie。 Cookie可以随着...

    JavaScript中Cookie操作实例

    JavaScript Cookie  Cookie对象:  Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cookie数据)。... (2)会话Cookie:不会存储到客户端的硬盘上,而是放在浏览器进程所处的内存当中,当

    sonlexqt-zombie-cookie:evercookie库的简化版本

    ts-zombie-cookie是一个JavaScript库,可帮助存储持久性HTTP cookie,该cookie在从网络浏览器专用cookie存储之外存储的备份中删除后会重新创建。 它可能在线存储或直接存储在访问者的计算机上,这违反了浏览器的...

    JavaScript学习笔记之Cookie对象

    JavaScript Cookie  Cookie对象:  Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cookie数据... (2)会话Cookie:不会存储到客户端的硬盘上,而是放在浏览器进程所处的内存当中,当浏览

    knockout-cookie:一个用于 KnockoutJS 的简单 jquery.cookie 扩展器

    使 observable 持久化它的值(基本上是一个会话)。 用cookie扩展它,它的值是存储 observable 的关键: // Will automatically load and save the value if it existsthis.someValue = ko.observable().extend({ ...

    mern-login-signup-component:使用Reactjs,Nodejs,Express,MongoDB和Bootstrap的基于最小会话的身份验证应用程序:locked:。 使用饼干:cookie:

    使用会话实现的持久性,会话ID存储在Cookie中 注销将从浏览器中删除数据库和cookie中的会话 全面响应台式机,平板电脑和移动设备 先决条件 Node.js NPM React MongoDB Atlas MongoURI 具有ENV变量的.env文件,...

    ASP下Cookie操作的详细讲解

    Cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持久地保持数据。Request和Response对象都有一组Cookie。Request.cookie集合是一系列Cookie,从客户端与HTTP ...

    无Cookie的ASP.NET

    会话状态使开发人员能够在用户与应用程序交互这段时间内持久保存有关该用户的一块信息。特定于用户的信息通常会保留20分钟长的时段,而每当用户返回该站点时,该时段都将重新开始计时。当用户首次连接到站点时,将以...

    guide-sessions:有关如何为应用程序创建,使用和缓存HTTP会话数据的指南:

    使用JCache和Hazelcast缓存HTTP会话数据 ...什么是会话持久性? 高流量的网站必须以快速可靠的方式支持数千个用户。 负载平衡要求并行运行同一应用程序的多个实例,以便可以将流量路由到不同的实例,以最大程度地

    new-site:一个简单的NodeJS + Express网站都已设置好,并准备使用Passport和Passport-Local进行用户名+密码身份验证,使用Passport-Remember-Me-Extended的持久本地cookie,通过Mongoose和View模板使用Express-Session和MongoDB的持久会话使用EJS

    一个简单的NodeJS + 网站都已设置好,并准备使用和进行用户名+密码身份验证,使用持久性本地cookie,通过和View模板的和持久性会话使用 。 概述 该站点包括需要身份验证的登录页面,注册页面和索引页面,并且使用...

    vagrant-haproxy:演示HAProxy的负载平衡会话持久性的无用的VM

    流浪者-haproxy 演示HAProxy的负载平衡/... 这通过cookie展示了我们的HAProxy的会话持久性。 通过vagrant ssh webserver1到另一个Web vagrant ssh webserver1 ,并通过键入以下sudo service apache2 stop模拟中断: s

Global site tag (gtag.js) - Google Analytics