Session对象详解

Session对象代表一次会话,当客户端打开浏览器到关闭浏览器这期间的操作称为一次会话

Session的创建时间:当request调用getSession()时调用,同时将Session存入服务器的内存

Session的传递过程:当创建Session后,服务器会给该Session分配一个ID,同时会将该ID存入Cookie中,Cookie的名字为JSESSIONID,然后将此Cookie发送至客户端,当客户端继续发送请求时会附加上此Cookie,当服务器端继续调用getSession()方法时,会根据ID在服务器内存中查找此ID,如果找到了,那么就回调用此Session,如果没有找到,那么会新建一个Session对象

Session的销毁时机:当服务器退出时销毁,或者Session超时后销毁,或者Session调用invalidate()方法

默认情况下,当客户端退出浏览器后,Session的ID在Cookid中也会消失,当客户端开启第二次会话时,已经找不到上一次会话的Session对象了,但是服务器内存中还保留着上一次会话产生的Session,默认情况下Session在服务器内存中驻留30分钟,如何在第二次会话中继续使用上一次的Session呢?可以设置Session的ID,将Cookie的时间不设置为退出时销毁,例如:

        HttpSession session = request.getSession();
        session.setAttribute("text","session-text");

        //覆盖Cookie的JSESSIONID
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        //设置Cookie存在时间
        cookie.setMaxAge(1800);
        //设置此Cookie的可以访问到的路径,整个web下的路径都可访问此Cookie
        cookie.setPath(request.getContextPath());

因为Session是通过Cookie传递的,如果客户端关闭了浏览器中的Cookie功能,将浏览器设置为拦截所有Cookie,那么如何传递Session的ID呢?

        HttpSession session = request.getSession();
        session.setAttribute("text","session-text");

        String url = "/day1121/test1.jsp";
        //将url进行重写,重写后的url会在链接后附加Session的ID
        url = response.encodeRedirectURL(url);
        //重定向
        response.sendRedirect(url);

注意:

        //非重定向使用此方法重写url
        String url = "/test1.jsp" ;
        url = response.encodeURL(url);

        //重定向使用此方法重写url
        String url = "/day1121/test1.jsp";
        url = response.encodeRedirectURL(url);

url重写后的示例:
http://localhost:8080/day1121/test1.jsp;jsessionid=8845ED0946D67A7BE8FDFC498FAE3480
这是服务器进行重定向后浏览器的URL地址栏的链接

注意:
encodeURL()和encodeRedirectURL()这两个方法会检测客户端是否禁止了Cookie,如果第一次使用此方法,检测到客户端没有禁用Cookie,继续使用此方法也不会在请求链接后附加Session的ID了

你可能感兴趣的:(java,android,Web,session,cookie)