共计 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 对象的路径有很多。比方:
-
通过 request 对象获取
ServletContext servletContext = request.getServletContext();
-
通过 session 对象获取
ServletContext servletContext = request.getSession().getServletContext();
-
通过 servletConfig 对象获取,在 Servlet 规范中提供了 ServletConfig 办法
ServletConfig servletConfig = getServletConfig(); ServletContext servletContext = servletConfig.getServletContext();
-
间接获取,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)