`
he_lux
  • 浏览: 104101 次
  • 性别: 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和Redis实现】

    - 对于大容量的会话数据,可以考虑定期将部分不活跃的会话数据持久化到磁盘,以节省内存资源。 通过以上步骤,我们可以实现一个高效的分布式会话追踪系统,既能保证用户状态的连续性,又能适应大规模的并发请求。...

    cookie 会话的操作

    与Cookie不同,它存储的数据量更大,且安全性相对更高,因为数据不在用户浏览器中持久化。 4. **创建会话**:服务器通常会生成一个唯一标识符(sessionID),并将这个ID分配给用户。然后将用户的数据存储在服务器的...

    经典收藏Cookie和Session

    通过以上内容,我们可以清楚地了解到Cookie与Session的基本概念及其区别,同时对于会话Cookie与持久Cookie的不同也有了更深入的理解。在实际应用中,合理选择和使用这两种机制可以帮助开发者更好地管理用户的会话...

    session与cookie的区别和联系?

    如果未设置过期时间,则默认为会话Cookie,在用户关闭浏览器后即被删除。 - **大小限制**:每个Cookie的大小通常不超过4KB。 - **Session**:Session是服务器为了跟踪用户的会话而创建的一个对象,用来存储特定...

    Cookie登录记录用户账号信息

    在Web应用程序中,Cookie常被用来存储用户的一些临时或持久性信息,如登录状态、用户首选项等。这是因为HTTP协议本身是无状态的,每次请求之间不保留任何上下文信息。为了解决这个问题,服务器会发送一个Cookie到...

    session 和cookie 区别

    会话cookie与持久cookie的主要区别在于它们的有效期: - **会话cookie**:没有设置过期时间,其生命周期仅限于当前的浏览器会话。一旦浏览器关闭,这类cookie将被自动清除。 - **持久cookie**:通过设置过期时间(如...

    C#操作cookie,解密加密cookie

    这种操作在需要持久化Cookie或通过网络传输Cookie时非常必要。 ### Cookie的加密与解密 #### 1. 加密的重要性 Cookie中可能包含敏感信息,如用户身份验证信息、会话ID等。因此,确保这些信息在传输过程中的安全性...

    Servlet会话机制(cookie and session)

    本文将深入探讨Cookie和Session两种主要的会话管理方式,并结合一个名为"ShoppingCar"的示例来阐述它们在实际应用中的工作原理。 **一、Cookie** Cookie是由服务器发送到客户端(浏览器)的一小段信息,然后由...

    cookie与session多可爱的伙伴

    Cookie有两种类型:会话Cookie和持久Cookie。会话Cookie在浏览器关闭后即消失,而持久Cookie可以通过设置过期时间在用户关闭浏览器后仍保留。 2. **Session机制**:Session则是在服务器端保存用户状态的技术。...

    使用Cookie进行会话管理.docx

    使用`setMaxAge`方法并指定秒数可以让Cookie持久化,值为0则删除Cookie。 在实际应用中,开发者需要根据业务需求选择合适的会话管理策略。对于敏感信息,通常使用Session来存储,因为它们不在客户端明文保存。而...

    Firefox插件cookie-editor-1.9.0

    2. **类型**:有Session Cookie(会话Cookie)和Persistent Cookie(持久性Cookie)。会话Cookie在浏览器关闭后消失,而持久性Cookie则设定过期日期,可在用户下次访问网站时继续使用。 3. **用途**:Cookie广泛用于...

    前台对于cookie的操作

    Cookie分为会话Cookie和持久Cookie两种类型,会话Cookie仅在当前浏览器会话期间有效,而持久Cookie则会根据设定的有效期存储在硬盘上。 #### 获取Cookie值 ```javascript function getCookie(cookieName) { var ...

    cookie机制和session机制的区别.docx

    在 cookie 机制中,还有两种类型的 cookie:会话 cookie 和持久 cookie。如果不设置过期时间,cookie 的生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这 种 生 命 期 为 浏 览 会 话 期 的 ...

    cookie会话技术

    当用户禁用Cookie时,可以通过URL重写技术来实现持久化的会话管理。 ```java String URL = response.encodeURL("/MyShop/SwitchBook?name=java"); out.println("点击购买&lt;/a&gt;"); ``` 这样即使用户禁用了...

    session与cookie

    **二、会话Cookie与持久Cookie的区别** 1. **会话Cookie**:若未设置过期时间,Cookie生命周期仅限于当前浏览器会话,关闭浏览器窗口后即消失,不保存在硬盘上。 2. **持久Cookie**:设置过期时间的Cookie会被保存...

    cookie和session

    - **会话Cookie**:默认情况下,Cookie是临时性的,仅在用户当前会话期间有效。 - **持久Cookie**:可以通过设置Cookie的有效期使其长期保存在用户的计算机上。 2. **有效期**: - **会话有效期**:这种类型的...

    Net Cookie操作读取数据

    3. 使用Session Cookie代替持久化Cookie:如果只需在会话期间保留状态,可以不设置过期时间,浏览器关闭后Cookie自动清除。 4. 对敏感信息加密:对存储在Cookie中的敏感信息进行加密,增强数据安全性。 总结,...

    cookie机制

    2. 持久Cookie(Persistent Cookie):这类Cookie会保存在客户端磁盘上,它们的过期时间可以由服务器指定,即使关闭浏览器或重启计算机,它们依然有效。 ### Cookie的应用场景 - **用户认证**:存储用户的登录信息...

Global site tag (gtag.js) - Google Analytics