JAVA中级(十二)session详解,session域,生命周期,创建过程

用户使用浏览器访问服务器资源进行会话时会产生各种数据,有些数据需要将其保存下来。有的数据保存在用户磁盘下[cookie],而有的时候需要将这些数据保存在服务器上。这个保存在服务器上的会话管理技术就是session。

一,浏览器中的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配置

<session-config>
<!--配置全局session有效时间,单位为分钟-->
        <session-timeout>10</session-timeout>
</session-config>

两种方法同时使用时,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做临时缓存是很适合的。做持久化还是不容易。坑有点大。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页