会话之Session

Session技术(服务器端的会话技术)

数据存储在服务器端
服务器会为每一个客户端创建一个Session对象,该客户端每次访问如果需要session对象,就返回之前创建的
服务器端的会话从第一次获得HttpSession对象开始的,直到HttpSession对象销毁结束

一.session概述

session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中

二. Session的入门案例

① 得到HttpSession对象

request.getSession();

② 设置共享数据

session.setAttribute("sessionMsg","sessionValue");

③ 获得共享数据

Object sessionMsg = session.getAttribute("sessionMsg");

④ 移除共享数据 session.removeAttribute("sessionMsg");

 

 

public class SessionServlet extends BaseServlet {

    protected void createSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println("session = " + session);
    }

    protected void addValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println("session = " + session);
        session.setAttribute("sessionMsg","sessionValue");
    }

    protected void getValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println("session = " + session);
        Object sessionMsg = session.getAttribute("sessionMsg");
        System.out.println("sessionMsg = " + sessionMsg);
    }

    protected void removeValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println("session = " + session);
        session.removeAttribute("sessionMsg");
    }

}

 

 

 

 

 

 

 移出的只是数据 不是对象 当你从新获取时 对象还是同一个对象,但是发现会取不到值

 

 

三.Session的工作机制

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生

  • 服务器端调用了request.getSession()方法

    • 服务器端检查当前请求中是否携带了JSESSIONID的Cookie

      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象

        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回

        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

 

 
服务器是如何办到客户端和session对应关系?
    是通过cookie办到的!session是依赖于cookie
    当客户端第一次访问服务器,调用getSession(),新建一个session对象,并且设置一个cookie给浏览器(jsessionid)
    当客户端第二次访问服务器,调用getSession(),就去获得请求中的jsessionid这个cookie,通过cookie的value值找到session对象

第一次

第一次 请求里面没有cookie,服务器会认为是一个新的客户端,第一次调用getSession(),就会新建一个session对象 就可以设置cokie

我们在响应里面就会有一个set-Coookie   这个cookie 一定要调用getSession()才会有

 第二次

 

 第二次就可以带着cookie 服务器就有cookie数据,跟着cookie数据就能得到session对象,所以session对象就不会新建  session对象不会新建,也就是不会在给响应

第二次的时候 响应里面就没有了 因为getsession不是新建的session对象,而是我们原来的session对象给获取过来

如何获取原来的session对象

是因为第二次的时候请求里面有一个cookie数据,把上次设置的cookie数据给带过去,服务器就可以根据cookie数据就能得到session对象

生活例子  

一个店里  有一个会员制 我们办理给 店家会给我们一张会员卡 以后的消费老板只让会员卡,而不会去认人,卡上会有卡号  可以查看个人的信息  如卡上还有多少钱等等

 

四 .Session的时效性

① 为什么Session要设置时限

用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

② 设置时限的难点

从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

③ 服务器端给Session对象设置最大闲置时间

  • 默认值:1800秒

最大闲置时间生效的机制如下:

 

会话什么时候结束?
    ① 客户端关闭(jsessionid这个cookie消失)
    ② 强制失效

    protected void removeSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println("session = " + session);
        session.invalidate();//强制失效
    }
移到数据 session对象还是在  直到销毁session对象

在重新获取的时候 因为之前的对象已经销毁了 然后getsession会重新建一个session对象 然后在给一个新的cookie




    ③ 自动失效(达到最大空闲时间)

 

 

无操作40秒后

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值