HttpSession对象
作用:服务端存储数据的技术解决Http无状态。 HTTP协议是一种无状态的协议,即服务器不会在请求之间保留任何数据。这意味着每个HTTP请求都是独立的,服务器不能自动识别一个用户的多次请求是否来自同一个人或应用程序。这给Web应用程序设计带来了许多问题。
HttpSession对象的特点
- HttpSession保存在服务端
- HttpSession使用Key与Value结构存储数据,HttpSession存储数据安全。
- HttpSession的Key是字符串类型,Value则是Object类型
- HttpSession存储数据大小无限制,Cookie存储数据大小有限制(<=4KB).
HttpSession对象的创建
介绍
-
一个浏览器在服务器中只会创建一个Session对象。不同用户(浏览器)的Session对象之间是互相独立的。
-
服务器中创建Session对象,创建完成后会将Session对象的 JSESSIONID 以Cookie的形式保存在客户端(浏览器)。用户再次发请求时,会携带该Cookie,也就是JSESSIONID到服务器,服务器会根据该Id找到用户的Session对象。
-
用户JSESSIONID的Cookie丢失或者服务器中存储的Session对象被销毁,服务器接收到用户的请求后,如果找不到对应的Session对象,会重新创建,并将新的JSESSIONID以Cookie的形式保存到浏览器中。
-
存储JSESSIONID的Cookie不需要手动创建,Session对象创建完成,Tomcat服务器会自动创建Cookie, 将JESSIONID存储在Cookie中响应回浏览器。
-
Cookie默认的有效期为一次会话(浏览器不能关闭),浏览器关闭,Cookie即失效。
-
Session对象在Tomcat服务器的默认有效期为30分钟。
HttpSession 对象的创建是通过 request.getSession() 方法来创建的。客户端浏览器在请求服务端资源时,如果在请求中没有 jsessionid , getSession() 方法将会为这个客户端浏览器创建一个新 的 HttpSession 对象,并为这个 HttpSession 对象生成一个 jsessionid ,在响应中通过 状态Cookie 写回给客户端浏览器,如果 在请求中包含了 jsessionid , getSession() 方法则根据这个 ID 返回与 这个客户端浏览器对应的 HttpSession 对象。
getSession() 方法还有一个重载方法 getSession(true|false) 。当参数为 true 时与 getSession() 方法作用相同。当参数为 false 时则只去 根据 jsessionid (无需指定)查找是否有与这个客户端浏览器对应的 HttpSession ,如果有则返回,如果没有 jsessionid 则不会创建新的 HttpSession 对象。
HttpSession的创建
HttpSession的创建,获取数据
HttpSession session = req.getSession();
session.getAttribute("user");
HttpSession的销毁方式
HttpSession的销毁方式
1 达到超时时间后会销毁,默认30分钟,时间的计算方式是根据最后一次请求时间作为起始时间开始计算。
可以通过修改项目的web.xml中的HttpSession的超时时间。该时间对整个web项目中的所有HttpSession对象有效。
<session-config>
<!--设置Session的超时时间,单位是分钟-->
<session-timeout>10</session-timeout>
</session-config>
2. 调用HttpSession对象中的invalidate()方法销毁。
session.invalidate();
HttpSession对象总结
HttpSession与Cookie的区别
1.cookie数据存放在客户的浏览器或系统的文件中,而HttpSession中的数据存放在服务器中。
2.cookie不安全(因为明文存储),而HttSession是安全的。
3. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而 HttpSession没有容量以及数量的限制。
2.HttpSession的使用建议
HttpSession 对象是保存在服务端的,所以安全性较高。我们可以在HttpSession 对象中存储数据,但是由于 HttpSession 对象的生命周期不固定,所以不建议存放业务数据。一般情况下我们只是存放用户登录信息。
ServletContext对象
问题
在实际功能中,不同的用户也可能会用到相同的数据,如果使用Session来进行存储,会造成同一份数据在服务器中被存储多份,浪费空间。
ServletContext对象, 在一个web项目中只创建一次,所有用户都可以获取及使用,可以实现不同用户请求的数据共享。
特点
-
ServletContext对象由Tomcat服务器在启动加载项目的时候完成创建。
-
ServletContext对象一个项目中只有一个,以任意方式获取到的都是同一个。
-
ServletContext对象中保存的数据是所有用户共享的。
1.获取ServletContext对象
//方式一:
ServletContext servletContext = this.getServletContext();
System.Out.Println("servletContext");
//方式二:
ServletContext servletContext1 = req.getSession().getServletContext();
//方式三:
ServletContext servletContext2 = req.getServletContext();
2.使用ServletContext对象存取数据
//往ServletContext对象中存数据,键值对的方式
servletContext.setAttribute("name", "root");
//从ServletContext对象中获取数据
String name = (String)servletContext.getAttribute("name");
ServletContext对象获取web.xml中配置的上下文参数
<!--配置上下文参数(全局参数)-->
<context-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>age</param-name>
<param-value>18</param-value>
</context-param>
ServletContext对象的生命周期
当服务器启动时会创建ServletContext对象。服务器关闭后该对象销毁。
ServletContext对象的生命周期很长,仅存放所有用户共享的数据。
域对象
什么是域对象
域对象类似于之前学习的map集合,可以存放键值对的数据。不同的是域对象中数据的使用有一定的区域范围限制。
三大域对象 HttpServletRequest对象 ,HttpSession对象,ServletContext对象。
常用API
总结
HttpServletRequest:请求对象(request对象:请求域对象)
生命周期
1.创建:客户端发起请求,服务器接收到请求,创建请求和响应对象。
发送一次请求,创建一次请求和响应对象。
2.销毁:响应回到客户端,请求和响应对象销毁。
作用
传输业务数据(根据业务需求获取到的数据)。
3.特点
一次请求有效。
HttpSession:会话对象(session对象:会话域对象)
1.生命周期
创建:客户端发起请求访问Servlet,Servlet中调用req.getSession()
1.请求的Cookie中有JSessionId
根据JSessionId找到了对应的session对象,直接使用。
根据JSessionId没有找到,创建新的session,将新session的JSessionId添加到Cookie中,响应回到客户端,客户端存储JSessionId。
2.请求的Cookie中没有JSessionId,创建新的session,将新session的JSessionId添加到Cookie中,响应回到客户端,客户端存储JSessionId
.销毁:
1.调用invalidate()方法销毁
2.最后一次访问后达到了最大的超时时间
3.客户端关闭了浏览器,JSessionId消失,JSessionId对应的session对象达到最大超时时间销毁
作用
存储用户登录信息
.特点
一次会话有效,可以为多次请求。
ServletContext:上下文对象(application对象:应用域对象)
1.生命周期
1.创建:tomcat启动后加载了项目,为项目创建一个ServletContext对象。
2.销毁:tomcat关闭,ServletContext对象销毁。
作用存储所有客户端共享的数据
3.特点
多个客户端有效(多次会话,多起请求有效)