文章目录:
5.request.getSession() 与 request.getSession(false)
6.HttpSeesion创建的session对象的销毁时机
1.介绍
1. HttpSession接口来自于Servlet规范中。
2. HttpSession接口实现类由Http服务器厂商提供。
3. HttpSession接口修饰对象被称为会话作用域对象。
4. 如果两个Servlet为同一个用户/同一个浏览器提供服务,此时可以借助于用户的HttpSession对象进行数据共享。
2.Cookie类和HttpSession接口的区别
1. 类型不同: Cookie是一个类,HttpSession是一个接口。
2. 存放位置不同:Cookie存放在客户端计算机,HttpSession(会话作用域对象)存放在服务端计算机内存。
3. 存放共享数据个数不同:一个cookie对象只能存储一个共享数据,一个会话作用域对象通过map存储,因此可以任何个共享数据。
4. 存放数据类型不同:cookie只能存放String类型的共享数据,会话作用域对象存放Object类型的共享数据。
5. 与用户关系: 一个用户可以拥有多个cookie,一个用户只能拥有一个会话作用域对象。
6. 参照物不同:cookie相当于用户在服务端拥有的会员卡,会话作用域对象相当于用户在服务端拥有的私人储物柜。
3.应用举例
package com.songzihao.controller; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; /** * */ public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //调用请求对象向Tomcat索要当前用户的私人储物柜 HttpSession session=request.getSession(); //将共享数据添加到当前用户的私人储物柜 session.setAttribute("key1",500); } /** * tomcat将当前用户的柜子编号以cookie形式写入响应头 * cookie("JSESSIONID",柜子编号) */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
package com.songzihao.controller; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; /** * */ public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //调用请求对象向Tomcat索要当前用户的私人储物柜 HttpSession session=request.getSession(false); //读取OneServlet存入的共享数据 Integer data= (Integer) session.getAttribute("key1"); System.out.println("TwoServlet得到的共享数据===" + data); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>com.songzihao.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one</url-pattern> </servlet-mapping> <servlet> <servlet-name>TwoServlet</servlet-name> <servlet-class>com.songzihao.controller.TwoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TwoServlet</servlet-name> <url-pattern>/two</url-pattern> </servlet-mapping> <session-config> <!-- session最大空闲时间5分钟 --> <session-timeout>5</session-timeout> </session-config> </web-app>
3.2 运行结果部分
4.工作原理图
5.request.getSession() 与 request.getSession(false)
在代码部分中,我们可以看到OneServlet中调用的是 request.getSession();TwoServlet中调用的是 request.getSession(false);
这两个方法肯定是有区别的,下面我们来看一下:
1. request.getSession():如果当前用户在服务端拥有私人储物柜,要求tomcat返回这个储物柜。
如果当前用户在服务端尚未拥有私人储物柜,要求tomcat为当前用户创建一个全新的私人储物柜。2. request.getSession(false):如果当前用户在服务端拥有私人储物柜,要求tomcat返回这个储物柜。
如果当前用户在服务端尚未拥有私人储物柜,要求tomcat返回null。3. 如果当前用户身份【经过登录验证审核判定为合法】,此时应该使用request.getSession()来索要私人储物柜。
4. 如果当前用户身份尚未确认合法,此时应该使用request.getSession(false)来索要私人储物柜。
6.HttpSeesion创建的session对象的销毁时机
1. 在浏览器关闭时,切断了用户与浏览器之间联系。但是tomcat是服务端计算机中资源调度软件无法侦测浏览器何时关闭的,因此在浏览器关闭时,服务端是不会销毁用户的session。
2. tomcat在创建session对象时,设置一个【最大空闲时间】。如果session对象从上次使用完毕到现在空闲时间达到了【最大空闲时间】,tomcat认为用户放弃了自己的session.此时tomcat负责销毁。
3. tomcat设置【最大空闲时间】是30分钟。
4. 在web.xm置session的最大空闲时间: