5.5.4 会话对象:session
第3章中介绍过HTTP协议的无状态性,也就是一旦连接结束,服务器端不保留连接的相关信息。在客户端使用了Cookie保存信息,但Cookie一般只能保存字符串等简单数据,不适于保存比较复杂的数据。
那么服务器是如何知道在不同页面之间跳转的用户是否是同一个用户,它又是怎样获取用户在访问各个页面期间所提交的信息的?在JSP中,服务器端使用了session对象来存储数据。
每一个session对象代表一个会话。会话是指从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器的整个过程。一个客户对同一服务目录中不同网页的访问属于同一会话。
当一个客户访问Web应用时,即JSP页面被装载时,服务器自动为用户生成一个独一无二的session对象。与此同时JSP引擎还会分配一个String类型的ID号并将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给他新的session对象。接下来当客户浏览这个Web应用的不同网页时,始终处于同一个session中。但当客户浏览器禁止Cookie时,引擎无法从客户端浏览器中获得存储在Cookie中的Session ID,也就无法跟踪客户状态。因此要使用session对象,不能在客户端禁止Cookie。
从一个客户会话开始到会话结束这段时间称为session对象的生命周期。在以下情况中,session对象将结束生命周期,session对象所占用的资源会被释放掉:①客户端关闭浏览器;②session对象过期;③服务器端调用了invalidate()方法。
1.常用方法
session内置对象提供了相应的方法创建及获取客户的会话,并设置session生命周期。常用方法及说明如表5-9所示。
表5-9 session对象常用方法及说明
2.应用示例
(1)创建及获取客户的会话
可以使用set Attribute()和get Attribute()方法创建及获取客户会话的属性。【例5-21】是一个非常简单的购物商店的代码示例。使用session对象存储顾客的姓名和购买的商品。
【例5-21】session对象的使用。
运行结果如图5-27、图5-28、图5-29所示。
图5-27 登录页面
图5-28 输入商品
图5-29 购物结果显示
(2)session对象的生命周期
session对象默认的生存时间为1 800秒。这个时间可以通过方法set Max InactiveInterval(int n)设置,对系统安全使用进行保护。【例5-22】给出了关于session对象的生命周期的一些设置方法。
【例5-22】session对象生命周期的设置。
运行结果如图5-30所示。
图5-30 session对象生命周期的设置