Session知多少?

一、什么是session?
①:Session是一个接口,类名是HttpSession.
②:Session是一个域对象( 域对象是可以像map一样存取数据的对象,域是数据操作的有效范围 )
③:我们经常会把用户登录之后的信息,保存到Session域中.
④:一般情况下.一个会话对象表示一个客户端( 服务器会为每个客户端都创建一个Sessison会话对象 )
⑤:Session是用于维护客户端和服务器之间关联的一种技术.

二、如何创建Session和获取(id号,是否为新)?
会话是用来表示一个客户端的对象.为了区分每个客户端的不同.每个会话对象都会有一个唯一的标识,我们管它叫会话id.
①:会话如何创建?又如何获取呢?
Session会话的创建和获取是同一个API =====>>>> request.getSession();
第一次调用 request.getSession() 是创建
之后调用 request.getSession() 是获取
②:Session是否是刚创建出来,还是创建好了获取到的.也可以通过一个API ===>>> isNew() 获取到它的状态是否是新的
isNew() 方法如果返回true表示刚创建出来的.
isNew() 方法如果返回false 表示是前面创建好之后,获取到的.
③:如何获取Session会话的唯一标识 ====>>>>> getId()
String sessionId = session.getId();

public void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        1、创建并获取session会话对象
        HttpSession session = request.getSession();
//        2、获取Session是否是新创建出来的状态  ,true表示新创建的,false表示前面创建好,获取的
        boolean isNew = session.isNew();
//        3、获取会话的唯一表示 ---会话id
        String sessionId = session.getId();

        response.setContentType("text/html;charset=UTF-8");

        response.getWriter().write("创建或获取session对象<br>");
        response.getWriter().write("isNew" + isNew + "<br>");
        response.getWriter().write("sessionId--->" + sessionId);
    }

三、Session域数据的存取?
参数是客户端在发请求的时候,发给服务器的额外数据 .这些数据的格式是: name=value&name=value
域数据,是服务器在实现业务过程中,自己给自己保存下来方便后面的程序使用的数据叫域数据.

setAttribute() 保存数据
getAttribute() 获取域数据
 /**
     * 向域对象中设置数据
     * @param request
     * @param response
     * @throws IOException
     */
    public void setAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.getSession().setAttribute("sessionKey","sessionValue");
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("已经往Session域对象中保存了数据");
    }

    /**
     * 获取域数据
     * @param request
     * @param response
     * @throws IOException
     */
    public void getAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Object sessionValue = request.getSession().getAttribute("sessionKey");
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("从Session域中获取前面保存的数据:" + sessionValue);
    }

四、Session的超时控制
①:Session会话,一旦超时之后,Session对象就会无效( 被销毁 )
②:有一个API可以获取Session会话的超时时长
getMaxInactiveInterval():int 以秒为单位
③:Session默认的超时时长是多少?
Session默认的超时时长为: 30分钟. —tomcat服务器web.xml文件中设置了默认session存活30分钟(可以自己修改)
④:如果你想给某个特殊的Session会话单独设置超时时长,也可以通过以下api进行设置.
setMaxInactiveInterval( int ) 以秒为单位
设置值为正数时,表示在指定的秒数后Session自动超时( 超时就是失效 )

 /**
     * session生命周期
     * 默认是:30分钟
     * 设置方式:
     * ①:在web.xml中进行配置,注意:我们在web.xml文件中配置的Session会话超时时间是对所有Session都生效的
     * ②:通过setMaxInactiveInterval()方法,参数以秒为单位
     *
     * @param request
     * @param response
     */
    public void sessionLife(HttpServletRequest request, HttpServletResponse response){
        //Session在3秒之后超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession session3 = request.getSession();
        // 设置过期时间为3秒
        session3.setMaxInactiveInterval(3);


        //Session在1分钟之后超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession session60 = request.getSession();
        // 设置过期时间为1分钟
        session60.setMaxInactiveInterval(60);


        //Session在1小时之后超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession session = request.getSession();
        // 设置过期时间为1小时
        session.setMaxInactiveInterval(60 * 60);


        //Session在1天之后超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession sessionOneDay = request.getSession();
        // 设置过期时间为1天
        sessionOneDay.setMaxInactiveInterval(60 * 60 * 24);


        //Session在1周之后超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession sessionOneWeek = request.getSession();
        // 设置过期时间为1周
        sessionOneWeek.setMaxInactiveInterval(60 * 60 * 24 * 7);


        //Session永远不超时
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession sessionNo = request.getSession();
        // 设置永远不超时
        session.setMaxInactiveInterval(-1);


        //Session马上超时(失效)
        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
        HttpSession sessionNew = request.getSession();
        // 让Session对象立即过期
        session.invalidate();
    }

五、浏览器和服务器Session之间关联的技术内幕—见关联内幕图解
服务器会为每个客户端创建一个Session会话对象. 这个会话对象用于区分每个客户端.
会话Session是浏览器打开后,访问服务器,Session就会被创建,浏览器关闭Session就会销毁( 无效 )
如果Session会话还没有超时,就已经关闭了浏览器,为什么也找不到原来的Session会话了.
因为浏览器一关闭Session对应的Cookie就被删除了
创建Session时,默认创建的Cookie的存活时间,就是浏览器一关,Cookie也被删除了
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值