前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Session

作者头像
Carlos Ouyang
发布2019-08-19 17:32:37
1.5K0
发布2019-08-19 17:32:37
举报
文章被收录于专栏:Java 学习日记Java 学习日记

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 分钟超时时间。如下所示:

代码语言:javascript
复制
<session-config>
    <session-timeout>15</session-timeout>
</session-config>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
  • 特点
  • 使用
  • Servlet Session
  • HttpSession 对象
  • 删除 Session 会话数据
  • web.xml 配置
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档