Servlet可以通过三个不同的作用域来存储对象:Session对象、Request对象、servletContext对象。
Session是用户的会话对象,当浏览器向服务器发送请求时,就产生了一个session对象;
Request是有关客户端所发出的请求对象;
servletContext是Servlet上下文的环境变量。这三个对象都提供了对于属性操作相同的方法:
setAttribute(String name,Object o) 调用此方法可以设置指定名字的对象(其中所有的名字都是String类型,而值是Object类型) |
getAttribute(String name) 调用该方法可以取得指定名字的对象 |
removeAttribute(String name) 该方法可以移除指定名字的对象 |
当Session(Request ,servletContext)对象调用getAttribute(String name,Object o)设置了属性后,在另一个地方调用getAttribute(String name)方法得到了开始设置的o,要注意的是:两次调用方法的对象必须是同一个对象。灵活运用getAttribute(String name,Object o)和getAttribute(String name)方法,会给传递参数的时候带来方便。
保存这三个对象范围内的数据,它们的生命周期是不同的:
Session中的数据对应客户机的浏览器进程,即浏览器不关闭,服务器Session中数据就有效;
Request中的数据,仅在一个请求应答的流程中有效;
servletContext中的数据,只要web服务器不关闭,就一直有效。
Session对象中存放的数据是名值对,其中所有的名字都是String类型,值是Object对象,这种存放数据的方式,跟Map对象以键值的方式存放数据类似。在服务器端的一个Session对象,对应了一个客户端的进程——客户的浏览器,当用户第一次通过,浏览器访问服务器时,服务器端会创建一个Session对象,并生成与该对象相对应的唯一的ID,服务器在应答浏览器时,将生成的ID一并送回给浏览器;浏览器将这个ID放到缓存中,当再次访问服务器时,这个ID会连同发送的请求一并发送给服务器,服务器就通过比对ID识别两次发送请求的是不是同一浏览器。但这个ID是有时间周期的,Session默认的时间周期是半小时(浏览器在第一次发送请求后,三十分钟内再没有向服务器发送请求),如果你想设置这个时间周期,可以通过Session对象调用setMaxInactiveInterval(int seconds)方法,传入一个以秒为单位的值设置时间周期;也可以在web.xml中设置会话的时间周期,如下面设置10分钟的会话的时间周期:
<session-config> <session-timeout>10</session-timeout> </session-config>
这样设置后,如果浏览器在十分钟内,未向服务器发送任何请求,先前生成的ID就自动销毁了,当再次向服务器发送请求的时候,服务器端会生成另外的一个ID。