Session服务器端会话技术

1. 概念

  • 服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象HttpSession中。

  • 获取session对象

    1
    2
    //获取session
    HttpSession session = request.getSession();
  • 使用HttpSession对象方法

    1. Object getAttribute(String name)
    2. void setAttribute(String name,Object value)
    3. void removeAttribute(String name)

2.原理

  • session的实现是依赖于cookie的。

    客户端浏览器访问服务器SessionDemo1资源时,该资源doget或者doPost方法中如果是第一次使用request.getSeesion()获取session对象,会在内存中创建一个session对象,并赋予一个ID值,服务器端的响应消息中携带set-cookie:JSESSION=ID值,浏览器保存该信息为cookie中。

    当客户端再次访问服务器资源时,再请求消息中包含cookie:JSESSION=ID值信息,服务器端再次使用request.getSeesion()获取session信息会在内存中查找是否有对应ID值的session对象。

3.session细节

  1. 当客户端关闭后,服务器端不关闭,两次获取session是否为同一个?

    • 默认情况下 不是
    • 如果需要获取同一个对象,则可以创建cookie,键为JSESSION,设置最大存活时间,让cookie持久化保存
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取session
    HttpSession session = request.getSession();
    System.out.println(session);
    //获取数据
    Object msg = session.getAttribute("msg");
    //手动将cookie JSESSIONID修改为当前session ID
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(60);
    response.addCookie(cookie);
    System.out.println(msg);
    }
  1. 客户端不关闭,服务器关闭后,两次获取的session时同一个吗?

    • 不是同一个,但是要确保数据不丢失

      session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上

      session的活化:在服务器启动后,将session文件转化为内存中的session对象即可,原session中数据不会丢失,但是session对象ID不一样。

    • tomcat服务器会自动进行钝化和活化,SESSION.ser文件存放在服务器安装目录下的work目录中,但是IDEA钝化时会将SESSION.ser文件存放在web项目CATALINA_BASE目录下的\work\Catalina\localhost\项目名称文件夹中,但是重新启动服务器时会先删除work目录,然后重新建立一个work目录,所以不会活化。

  2. session的失效时间

    • 服务器关闭
    • session对象调用invaliddate()
    • session默认失效时间 30分钟,也可以在tomcat安装目录下的conf文件夹中的web.xml进行设置
    1
    2
    3
    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>

4.session和cookie的区别

  • session运行在服务器端,cookie运行在客户端

  • cookie有大小和个数限制,session没有大小限制,而是和服务器的内存大小有关

  • cookie有安全隐患,通过拦截或本地文件找到cookie后来可以进行攻击

  • session保存在服务器一段时间后才会消失,session过多会增加服务器的压力