Session

Posted zhuobo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Session相关的知识,希望对你有一定的参考价值。

Session

1. 概念:

服务端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HTTPSession)中;

2. HTTPSession对象

  1. 获取Session对象:
    1. request.getSession()
  2. Session对象的方法:
    1. setAttribute(String name, Object value)
    2. Object getAttribute(String name)
    3. void removeAttribute(String name)

3. Session原理

在一次会话的范围内,不同的请求可能会都会创建session对象,而且在一次会话的session对象都是同一个。Session是依赖Cookie实现的,实现的过程如下:

  1. 当某次会话中首次创建Session对象时,会为该Session对象生成一个ID
  2. 在响应信息的信息头里带着一个SetCookie的头,值为 JSESSIONID=325803485DF8983D23D
  3. 浏览器收到响应信息,在浏览器创建一个 Cookie
  4. 浏览器下次请求,请求头会带着Cookie,值为 JSESSIONID=325803485DF8983D23D
  5. 当服务器试图创建Session对象时,首先判断内存中是否对应ID为 325803485DF8983D23D的Session对象,如果有就使用该Session对象

4.Session的细节

  1. 客户端关闭后,服务器不关闭,两次获取的Session是同一个吗?

    1. 默认情况下不是,因为没有JSESSIONID这个Cookie

    2. 但是客户实现获取到同一个,只要创建一个Cookie,键为 JSESSIONID,值为随便写一个,并设置最大存活时间

      Cookie cookie = new Cookie("JSESSIONID","2340324802d78900f");
      cookie.setMaxAge(60*60);
      response.addCookie(cookie);
  2. 当客户端不关闭,服务器关闭,两次获取的Session

    1. ? 服务器关闭就销毁了Session对象了,不是同一个了!但是要确保数据不丢失,就要在服务器关闭前将Session对象存储到硬盘:
      • Session的钝化:服务器正常关闭前,将Session对象序列化到硬盘上(序列化)
      • Session的活化:服务器启动后,将session文件转化为内存中的Session对象(反序列化)
  3. Session的销毁时间:

    1. 服务器关闭

    2. Session对象调用方法 invalidate()

    3. Session对象的默认失效时间是 30分钟

      • 在web.xml里可以修改该失效时间:

          <!-- ==================== Default Session Configuration ================= -->
          <!-- You can set the default session timeout (in minutes) for all newly   -->
          <!-- created sessions by modifying the value below.                       -->
        
            <session-config>
                <session-timeout>30</session-timeout>
            </session-config>
        

5. Session的特点:

  1. Session是用于存储一次会话的多次请求数据,存储在服务器端

  2. session可以存储任意类型的、任意大小的数据

  3. 与cookie的区别:

    Cookie Session
    数据存储在客户端 数据存储在服务器端
    数据没有大小限制 数据有大小,数量限制
    数据相对安全 数据相对不安全

以上是关于Session的主要内容,如果未能解决你的问题,请参考以下文章

一个队asp.net session进行了再次封装的C#类的代码

redis存储session配制方法

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

sqlserver-处理死锁

暑假自学JAVA Web心得

hibernate在使用getCurrentSession时提示no session found for current thread