关于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)。
分享到:
相关推荐
- 对于大容量的会话数据,可以考虑定期将部分不活跃的会话数据持久化到磁盘,以节省内存资源。 通过以上步骤,我们可以实现一个高效的分布式会话追踪系统,既能保证用户状态的连续性,又能适应大规模的并发请求。...
与Cookie不同,它存储的数据量更大,且安全性相对更高,因为数据不在用户浏览器中持久化。 4. **创建会话**:服务器通常会生成一个唯一标识符(sessionID),并将这个ID分配给用户。然后将用户的数据存储在服务器的...
通过以上内容,我们可以清楚地了解到Cookie与Session的基本概念及其区别,同时对于会话Cookie与持久Cookie的不同也有了更深入的理解。在实际应用中,合理选择和使用这两种机制可以帮助开发者更好地管理用户的会话...
如果未设置过期时间,则默认为会话Cookie,在用户关闭浏览器后即被删除。 - **大小限制**:每个Cookie的大小通常不超过4KB。 - **Session**:Session是服务器为了跟踪用户的会话而创建的一个对象,用来存储特定...
在Web应用程序中,Cookie常被用来存储用户的一些临时或持久性信息,如登录状态、用户首选项等。这是因为HTTP协议本身是无状态的,每次请求之间不保留任何上下文信息。为了解决这个问题,服务器会发送一个Cookie到...
会话cookie与持久cookie的主要区别在于它们的有效期: - **会话cookie**:没有设置过期时间,其生命周期仅限于当前的浏览器会话。一旦浏览器关闭,这类cookie将被自动清除。 - **持久cookie**:通过设置过期时间(如...
这种操作在需要持久化Cookie或通过网络传输Cookie时非常必要。 ### Cookie的加密与解密 #### 1. 加密的重要性 Cookie中可能包含敏感信息,如用户身份验证信息、会话ID等。因此,确保这些信息在传输过程中的安全性...
本文将深入探讨Cookie和Session两种主要的会话管理方式,并结合一个名为"ShoppingCar"的示例来阐述它们在实际应用中的工作原理。 **一、Cookie** Cookie是由服务器发送到客户端(浏览器)的一小段信息,然后由...
Cookie有两种类型:会话Cookie和持久Cookie。会话Cookie在浏览器关闭后即消失,而持久Cookie可以通过设置过期时间在用户关闭浏览器后仍保留。 2. **Session机制**:Session则是在服务器端保存用户状态的技术。...
使用`setMaxAge`方法并指定秒数可以让Cookie持久化,值为0则删除Cookie。 在实际应用中,开发者需要根据业务需求选择合适的会话管理策略。对于敏感信息,通常使用Session来存储,因为它们不在客户端明文保存。而...
2. **类型**:有Session Cookie(会话Cookie)和Persistent Cookie(持久性Cookie)。会话Cookie在浏览器关闭后消失,而持久性Cookie则设定过期日期,可在用户下次访问网站时继续使用。 3. **用途**:Cookie广泛用于...
Cookie分为会话Cookie和持久Cookie两种类型,会话Cookie仅在当前浏览器会话期间有效,而持久Cookie则会根据设定的有效期存储在硬盘上。 #### 获取Cookie值 ```javascript function getCookie(cookieName) { var ...
在 cookie 机制中,还有两种类型的 cookie:会话 cookie 和持久 cookie。如果不设置过期时间,cookie 的生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这 种 生 命 期 为 浏 览 会 话 期 的 ...
当用户禁用Cookie时,可以通过URL重写技术来实现持久化的会话管理。 ```java String URL = response.encodeURL("/MyShop/SwitchBook?name=java"); out.println("点击购买</a>"); ``` 这样即使用户禁用了...
**二、会话Cookie与持久Cookie的区别** 1. **会话Cookie**:若未设置过期时间,Cookie生命周期仅限于当前浏览器会话,关闭浏览器窗口后即消失,不保存在硬盘上。 2. **持久Cookie**:设置过期时间的Cookie会被保存...
- **会话Cookie**:默认情况下,Cookie是临时性的,仅在用户当前会话期间有效。 - **持久Cookie**:可以通过设置Cookie的有效期使其长期保存在用户的计算机上。 2. **有效期**: - **会话有效期**:这种类型的...
3. 使用Session Cookie代替持久化Cookie:如果只需在会话期间保留状态,可以不设置过期时间,浏览器关闭后Cookie自动清除。 4. 对敏感信息加密:对存储在Cookie中的敏感信息进行加密,增强数据安全性。 总结,...
2. 持久Cookie(Persistent Cookie):这类Cookie会保存在客户端磁盘上,它们的过期时间可以由服务器指定,即使关闭浏览器或重启计算机,它们依然有效。 ### Cookie的应用场景 - **用户认证**:存储用户的登录信息...