Session

Request 对象解决了一次请求内的不同 Servlet 的数据共享问题,而对于一个用户的不同请求的处理需要使用相同的数据时我们需要使用session 技术。

原理

用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象。

特点

  1. Session 技术是依赖Cookie 技术的服务器端的数据存储技术
  2. 由服务器进行创建
  3. 每个用户独立拥有一个session
  4. 默认存储时间为 30 分钟
  5. 解决了一个用户的不同请求的数据共享问题

使用

  1. 创建 Session 对象
  2. 存储数据到 session 对象,再次访问时获取 session 对象
  3. 从 session 对象获取数据
  4. 如果获取 session 中不存在的数据返回null。
  5. 作用域:一次会话

只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意 Servlet 中获取到的都是同一个session 对象。

Servlet Session

HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:

  1. Cookies
  2. 隐藏的表单字段
  3. URL 重写

HttpSession 对象

除了上述的三种方式,Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

通过调用 HttpSession session = request.getSession(); 来获取 HttpSession 对象。你需要在向客户端发送任何文档内容之前调用 request.getSession()。

HttpSession 对象中可用的几个重要的方法:

  • public Object getAttribute(String name): 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null
  • public Enumeration getAttributeNames(): 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称
  • public long getCreationTime(): 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位
  • public String getId(): 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串
  • public long getLastAccessedTime(): 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位
  • public int getMaxInactiveInterval(): 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位
  • public void invalidate(): 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象
  • public boolean isNew(): 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true
  • public void removeAttribute(String name): 该方法将从该 session 会话移除指定名称的对象
  • public void setAttribute(String name, Object value): 该方法使用指定的名称绑定一个对象到该 session 会话
  • public void setMaxInactiveInterval(int interval): 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位

删除 Session 会话数据

  1. 移除一个特定的属性:您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值
  2. 删除整个 session 会话:您可以调用 public void invalidate() 方法来丢弃整个 session 会话
  3. 设置 session 会话过期时间:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时

web.xml 配置

使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,下面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间。如下所示:

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Session

    类比:session相当于发会员卡,会员卡上只有卡号(sessionID)。下次去健身房的时候,只要看卡号上,就能确定你本人的去他信息。 而cookie相当于把...

    代码之风
  • express-session设置session详解

    用express web开发框架开发网站时,关于session的设置大致可以分为两种情况,一种是只要用户通过浏览器访问网站就会生成session,第二种是只有用...

    挥刀北上
  • Falsk框架 Session 与 Flask-Session

    出 处:https://www.cnblogs.com/guokaifeng/

    郭楷丰
  • PHP Session

    Session 保存在服务端。保存在超全局变量 $_SESSION。 设置 Session 在 PHP 文件最上方开启 Session session_star...

    康怀帅
  • Cookie、Session

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

    py3study
  • django session

    Coxhuang
  • redis 存储session实现session共享

       nginx 作为代理    tomcat集群    redis存储共享session ?      nginx采用轮询方式将动态请求反向代理给tomcat...

    杉枫
  • Cloud Foundry Session Affinity(Sticky Session)的实现

    会话保持(Session Affinity),有时又称粘滞会话(Sticky Sessions), 是负载均衡领域设计需要着力解决的重要问题之一,也是一个相对比...

    Jerry Wang
  • Session分布式共享 = Session + Redis + Nginx

    一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Sess...

    逸鹏

扫码关注云+社区

领取腾讯云代金券