一,浏览器中的session
在web系统中,服务器可以为每个浏览器创建一个session对象,我们可以将数据保存在这个session中,这样就可以在用户访问服务器其它资源的时候就可以从这个session取出这个数据。服务器默认只会给浏览器创建一个session对象。
二,session的创建过程
1,session是如何来为用户服务的?
当服务器中的servlet执行request.getSession();时如果没有JsessionID或没有id相匹配的session时会创建一个session同时生产一个id并将这个id存到cookie写到用户浏览器中。当用户再次访问服务器时就会带上这个cookie的id.此时服务器在用这个id与内存中的session进行匹配。匹配成功即可使用这个session来服务。
session的创建过程代码实现如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
//当没有id匹配内存session时创建session
HttpSession session = request.getSession();
PrintWriter writer = response.getWriter();
if(session.isNew()){
writer.write("第一次创建session:"+session.getId());
}else{
writer.write("非第一次创建:"+session.getId());
}
}
第一次执行结果如下
再次执行结果如下:
这样session的创建过程就说完了
三,session域对象
session是一个域对象,与之id相配时就能共享它的数据。范围比request大。只要能取到对应的id即便重新发起请求也能共享数据。
域对象就是一个保存数据的区域,开头说过session是一个能将用户数据保存在服务器内存中的一个对象。说到数据保存的对象就要知道如何往里面进行数据的增删改查了。
域对象通用方法
方法 | 返回值 | 描述 |
---|---|---|
setAttribute(String key,Object value) | void | 将数据以键值对的形式保存在对象中 |
getAttribute(String key) | Objcet | 根据存入的key 来获取对应的值 |
removeAttribute(String key) | void | 根据key来删除对应的值 |
四,session生命周期.
1,session的创建
当服务器第一次执行request.getSession()或者执行这句话没有与之相匹配的id时创建一个Session.
2,Session的销毁
(1)session默认30分钟不使用时销毁。注意是不使用,也就是你在30分钟内不挂机的话它就不会自动销毁。可以通过以下两种方式设置有效时间
使用以下这个方法:
方法 | 描述 |
---|---|
setMaxInactiveInterval(int secone) | 设置当前获取的这个session的有效时间,单位为秒 |
或者在web.xml配置
10
两种方法同时使用时,setMaxInactiveInterval()优先级更高,它设置的是当前获取的session的有效时间.
(2)手动执行invalidate()方法时session销毁
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
//设置当前获取的session的有效时间
session.setMaxInactiveInterval(20);
//手动销毁session
session.invalidate();
}
五,关于浏览器关闭后session失效问题
1,创建session后关闭浏览器然后马上重新打开重新访问时会再次创建session。原因有两个:
(1)session刚好过期了
(2)session没过期,只是关闭浏览器后cookie被销毁导致再次打开浏览器后访问服务器时没有携带对应的JSESSIONID导致无法匹配从而重新创建。即浏览器关闭时session并没有被销毁只是获取不到它的id导致这个session永远无法访问到。但这个session不会一直占用内存,过期后自动销毁
2,那么要如何来解决关闭浏览器后就无法获取JSESSIONID的问题?
(1)自定义一个Cookie以JSESSIONID为值,id是值。并设置有效时间添加到浏览器中
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
//自定义Cookie来将id保存起来,并设置有效时间.
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(session.getMaxInactiveInterval());
response.addCookie(cookie);
}
然后访问该资源后效果如下:
这样就能处理关闭浏览器后session失效的问题。不过这样做的话这个sessionId的有效期就真的只有30分钟(默认时间)。30分钟后无论你是否关闭浏览器此session你都访问不到了。因为没id了。但是在这30分钟内你不管怎么关闭浏览器都能再次访问到该session。因此我们很少用session来做这种类似Cookie的本地持久化保存。因为麻烦。而且cookie要是被禁用这个方法就没用了。在那种情况就只能借助数据库。所以session做临时缓存是很适合的。做持久化还是不容易。坑有点大。