不懂HttpSession对象看这里乐字节

8次阅读

共计 3792 个字符,预计需要花费 10 分钟才能阅读完成。

HttpSession 对象

HttpSession对象是 javax.servlet.http.HttpSession 的实例,该接口并不像 HttpServletRequest 或 HttpServletResponse 还存在一个父接口,该接口只是一个纯正的接口。这因为 session 自身就属于 HTTP 协定的领域。

​ 对于服务器而言,每一个连贯到它的客户端都是一个 session,servlet 容器应用此接口创立 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连贯或来自用户的页面申请。一个会话通常对应于一个用户,该用户可能屡次拜访一个站点。能够通过此接口查看和操作无关某个会话的信息,比方会话标识符、创立工夫和最初一次拜访工夫。在整个 session 中,最重要的就是属性的操作。

​ session 无论客户端还是服务器端都能够感知到,若从新关上一个新的浏览器,则无奈获得之前设置的 session,因为每一个 session 只保留在以后的浏览器当中,并在相干的页面获得。

​ Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的屡次申请)期间共享数据。咱们能够通过 request.getSession()办法,来获取以后会话的 session 对象。

// 如果 session 对象存在,则获取;如果 session 对象不存在,则创立
HttpSession session = request.getSession();

标识符 JSESSIONID

​ Session 既然是为了标识一次会话,那么此次会话就应该有一个惟一的标记,这个标记就是 sessionId。

​ 每当一次申请达到服务器,如果开启了会话(拜访了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie,如果没有则认为这是一次新的会话,会创立 一个新的 session 对象,并用惟一的 sessionId 为此次会话做一个标记。如果有 JESSIONID 这 个 cookie 回传,服务器则会依据 JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则认为是一个新的会话,从新创立一个新的 session 对象,并标记此次会话;如果找到了相应的 session 对象,则认为是之前标记过的一次会话,返回该 session 对象,数据达到共享。

​ 这里提到一个叫做 JSESSIONID 的 cookie,这是一个比拟非凡的 cookie,当用户申请服务器时,如果拜访了 session,则服务器会创立一个名为 JSESSIONID,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并增加到 response 对象中,响应给客户端,无效工夫为敞开浏览器。

​ 所以 Session 的底层依赖 Cookie 来实现。

session 域对象

​ Session 用来示意一次会话,在一次会话中数据是能够共享的,这时 session 作为域对象存在,能够通过 setAttribute(name,value) 办法向域对象中增加数据,通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name) 从域对象中移除数据。

// 获取 session 对象 
HttpSession session = request.getSession();
// 设置 session 域对象
session.setAttribute("uname","admin");
// 获取指定名称的 session 域对象
String uname = (String) request.getAttribute("uname");
// 移除指定名称的 session 域对象
session.removeAttribute("uname");

​ 数据存储在 session 域对象中,当 session 对象不存在了,或者是两个不同的 session 对象时,数据也就不能共享了。这就不得不谈到 session 的生命周期。

session 对象的销毁

默认工夫到期

​ 当客户端第一次申请 servlet 并且操作 session 时,session 对象生成,Tomcat 中 session 默认的存活工夫为 30min,即你不操作界面的工夫,一旦有操作,session 会从新计时。

​ 那么 session 的默认工夫能够改么?答案是必定的。

​ 能够在 Tomcat 中的 conf 目录下的 web.xml 文件中进行批改。

<!-- session 默认的最大不流动工夫。单位:分钟。-->
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

本人设定到期工夫

​ 当然除了以上的批改形式外,咱们也能够在程序中本人设定 session 的生命周期,通过 session.setMaxInactiveInterval(int) 来设定 session 的最大不流动工夫,单位为秒。

// 获取 session 对象 
HttpSession session = request.getSession();
// 设置 session 的最大不流动工夫
session.setMaxInactiveInterval(15); // 15 秒

​ 当然咱们也能够通过 getMaxInactiveInterval() 办法来查看以后 Session 对象的最大不流动工夫。

// 获取 session 的最大不流动工夫
int time = session.getMaxInactiveInterval();

立即生效

​ 或者咱们也能够通过 session.invalidate() 办法让 session 立即生效

// 销毁 session 对象
session.invalidate();

敞开浏览器

​ 从后面的 JESSIONID 可晓得,session 的底层依赖 cookie 实现,并且该 cookie 的无效工夫为敞开浏览器,从而 session 在浏览器敞开时也相当于生效了(因为没有 JSESSION 再与之对应)。

敞开服务器

​ 当敞开服务器时,session 销毁。

​ Session 生效则意味着此次会话完结,数据共享完结。

ServletContext 对象

​ 每一个 web 利用都有且仅有一个 ServletContext 对象,又称 Application 对象,从名称中可知,该对象是与应用程序相干的。在 WEB 容器启动的时候,会为每一个 WEB 应用程序创立一个对应的 ServletContext 对象。

​ 该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用程序中共享;第二、该对象中保留了以后应用程序相干信息。例如能够通过 getServerInfo() 办法获取以后服务器信息,getRealPath(String path) 获取资源的实在门路等。

ServletContext 对象的获取

​ 获取 ServletContext 对象的路径有很多。比方:

  1. 通过 request 对象获取

    ServletContext servletContext = request.getServletContext();
  2. 通过 session 对象获取

    ServletContext servletContext = request.getSession().getServletContext();      
  3. 通过 servletConfig 对象获取,在 Servlet 规范中提供了 ServletConfig 办法

    ServletConfig servletConfig = getServletConfig();
    ServletContext servletContext = servletConfig.getServletContext();
  4. 间接获取,Servlet 类中提供了间接获取 ServletContext 对象的办法

    ServletContext servletContext = getServletContext();

罕用办法

// 获取我的项目寄存的实在门路
String realPath = request.getServletContext().getRealPath("/");
// 获取以后服务器的版本信息
String serverInfo = request.getServletContext().getServerInfo();

ServletContext 域对象

​ ServletContext 也可当做域对象来应用,通过向 ServletContext 中存取数据,能够使得整个应用程序共享某些数据。当然不倡议寄存过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会始终保留。

// 获取 ServletContext 对象
ServletContext servletContext = request.getServletContext();
// 设置域对象
servletContext.setAttribute("name","zhangsan");
// 获取域对象
String name = (String) servletContext.getAttribute("name");
// 移除域对象
servletContext.removeAttribute("name");

加 VX 理解点我扫码支付
学习更多常识,请退出企鹅群:1080355292,入群暗号(33)

正文完
 0