前言
Cookie将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是如果当传递的信息较多时,Cookie技术会增大服务器程序处理的难度,因此,Servlet提供了另一种会话技术————Session,Session可以将会话数据保存到服务器中。
1、Session对象
Session类似于医院的就诊卡,卡上只有卡号。但当人们去医院就诊时,只要出示就诊卡,就可以查询到病人的就诊信息和病理档案
1.1 Session概述
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将ID传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务
除此之外,Session还具有更高的安全性,它将关键数据保存在服务器中。而Cookie将数据保存在客户端的浏览器中。因此Cookie是较为危险的,若客户端遭遇黑客攻击,Cookie信息容易被窃取,数据也可能被篡改,而运用Session可以有效的避免这种情况的发生
1.2 HttpSession API
Session是与每个请求消息紧密相关的,为此HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式:
1、public HttpSession getSession(boolean create)
参数create判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null
2、public HttpSession getSession()
注意:由于getSession()方法可能会产生发送会话标识号的Cookie头字段,所以必须在发送任何响应内容之前调用getSession()方法
HttpSession接口的常用方法:
1、String getID()
功能:用于返回与当前HttpSession对象相关联的会话标识号
2、long getCreationTime()
功能:用于返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间的时间差毫秒的表示形式
3、long getLastAccessedTime()
功能:用于返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间的时间差毫秒的表示形式
4、void SetMaxInactiveInterval(int interval)
功能:用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
5、boolean isNew()
功能:判断当前HttpSession对象是否是新创建的
6、void invalidate()
功能:用于强制使Session对象无效
7、ServletContext getServletContext()
功能:用于返回当前HttpSession对象所属于的Web应用程序对象,即代表当前Web应用程序的ServletContext对象
8、void setAttribute(String name,Object value)
功能:用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
9、String getAttribute()
功能:用于从当前HttpSession对象中返回指定名称的属性值
10、void removeAttribute(String name)
功能:用于从当前HttpSession对象中删除指定名称的属性
1.3 Session的生命周期
Session也具有一定的生命周期
Session生效:Session在用户第一次访问服务器时创建。需要注意的是,只有访问JSP、Servlet等程序时才会创建Session。此外,还可调用request.getSession(true)强制生成Session。只访问HTML、IMAGE等静态资源并不会创建Session
Session失效:有两种方法可以使Session失效,分别是“超时限制”使Session失效和强制Session失效
- “超时限制”使Session失效
Web服务器采用“超时限制”判断客户端是否还在继续访问。在一定时间内,如果某个客户端一直没有请求访问,那么Web服务器就会认为该客户端已经结束请求,并且将与该客户端会话所对应的HttpSession对象变成垃圾对象,等待垃圾收集器将其从内存中彻底清除。如果浏览器超时后再次向服务器发出请求访问,那么服务器会创建一个新的HttpSession对象,并为其分配一个新的ID属性
- 强制Session失效
invalidate()方法可以强制使Session对象失效,具体用法:
HttpSession session = request.getSession();
session.invalidate();//注销该request的所有session
配置Session失效时间:
- 1、在项目的web.xml文件中配置Session的失效时间,具体代码(默认单位为分钟):
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2、在Servlet程序中手动设置Session的失效时间,具体代码(默认单位为秒):
session.SetMaxInactiveInterval(30 * 60)//设置为-1为永不超时
在Tomcat安装目录的conf\web.xml文件中也有
<session-config>
<session-timeout>30</session-timeout>
</session-config>设置为0或负数,表示永不超时
该文件对站点下所有Web应用程序都有效