会话COOKIE? 持久COOKIE?

关于COOKIE和SESSION的关系,一直没搞清楚。网上一搜COOKIE,普遍都有会话COOKIE和持久COOKIE的概念。

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

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

刚开始理解时,我也认为会有持久和会话这两种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,页面显示
[quote][b]cookies is null.[/b]
[b]session is not null.[/b]
session id: 0D0AABB6F911362FEE87BEEB2953C33F[/quote]

第二次访问,页面显示
[quote][b]cookies is not null.[/b]
cookie0 name: new
cookie1 name: JSESSIONID
[b]session is not null.[/b]
session id: 0D0AABB6F911362FEE87BEEB2953C33F[/quote]

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

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

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

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

然后根据zddava的博客([url]http://zddava.iteye.com/blog/311053[/url]),找到了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)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值