先总体说一下关系: cookie和session属于会话技术,通俗的讲,cookie是创建数据,存入浏览器缓存,而session是在服务器端创建的域对象,它的范围是一个会话。
而其它的域对象包括 ServletContext, request,比较一下这三个域对象之间的区别
范围:
ServeltContext > session > request
ServletContext的范围是整个web项目的.
session是会话级别的.
request仅限于一次请求,比如我现在请求google,结果google直接让我转发到了bing,这也是属于一次请求的,是转发,而不是重定向喔
生命周期:
ServletContext是整个web应用的,服务器开启(web项目启动)的时候就已存在,服务器关闭之后(web项目销毁)才销毁。
session有三种销毁方式:
1 :手动调用invalidate方法销毁
2:超出会话时间,除非手动手设置,不然默认30分钟,这个可以在你Tomcat全局的web.xml配置中查到
3 : 服务器关闭,也就是web项目销毁。
request:是发出请求,如果请求被响应返回了,声明周期也就到头了.
注意,一个请求一个域,不同请求不同域
还有一个常见的误解,在浏览器关闭之后,session被认为销毁了,这是不对的,这要提及session的原理.
之所以session是会话级别的,也就是用户级别的,但是服务器如何直到你是哪个用户的session呢?
所以当有请求的时候,服务器会根据一个id ,JSESSIONID(jsessionid)来判断. 这个id可以看做是你的浏览器,当你第一次访问一个网站的时候,比如csdn, 那么 csdn 就会创建一个属于你的session域对象,这个和这个域对象一起的有这个id, csdn 会把这个id返回给你的 , 好 , 这里就很好理解了, 属于你session 的 id 实际上是存储在cookie里的, 而 cookie 也是属于 会话 级别的, 关掉浏览器之后, cookie没了, 所以id也没了, 你的session属于孤魂野鬼了,
所以 当你 再次访问csdn的时候, csdn会判断你这个session是属于那个id的, 但是你id 没了, 所以认不出来, csdn就会重新创建一个新的id,新的session对象.
可以看到其实你浏览器关了之后,是cookie销毁了,所以session的id也没了,究其原因是 cookie , 所以只要设置cookie 就好了
把当前session的id设置到cookie中去,并设置持久化时间,指定cookie范围
Cookie cookie = new Cookie(“JSESSIONID”, session.getId());
cookie.setMaxAge(60 * 60);
cookie.setPath("/SessionACookie");
resp.addCookie(cookie);