乐趣区

维持客户端状态

许多应用都需要一个客户端的多个请求是相互关联。例如,一个 web 程序能在多个请求间保存用户的状态。基于 web 的应用程序都有维护这些状态的能力,因为 HTTP 是无状态的。为了支持这些,web 应用程序需要维护状态,servlet 技术提供了管理 session 的 api,并且有几种实现会话的机制。
访问一个 session
session 代表一个 HttpSession 对象。你可以通过请求的 getSession 方法访问 session。这个方法返回关联到当前请求的 session 对象,或者,如果当前请求还没有 session,这个方法会生成一个。
session 关联的对象
你可以通过名称关联对象 - 值属性到 session。这些属性可以被同一个 web 上下文处理同一个 session 的请求访问。注意,你的应用程序可以通知 web 上下文和 servlet 生命周期(Handling Servlet Lifecycle Events)中的 session 监听器。您还可以通知与会话关联的某些事件的对象,例如以下内容:

当往 session 中添加或移除一个对象。为了接收通知,你的对象必须实现 javax.servlet.http.HttpSessionBindingListener 接口。
当附加对象的 session 被休眠或激活。在虚拟机之间移动或保存到永久存储并从中恢复时,会话将被钝化或激活。为了接收通知,你的对象必须实现 javax.servlet.http.HttpSessionActivationListener 接口。

session 管理
因为 HTTP 客户端没有方法去标记是否不再需要一个 session。每一个 session 都关联了一个超时时间,以便于资源的回收利用。这个超时阶段可以通过 session 的 getMaxInactiveInterval 和 setMaxInactiveInterval 方法访问。

为了确保活跃的 session 不被设置为超时,您应该使用服务方法定期访问会话,因为这会重置会话的生存时间计数器。
当与一个特定客户端交互完成后,你可以在服务端使用 invalidate 方法设置一个 session 无效、删除任何 session 数据。

使用 netbeans 设置超时时间
要使用 NetBeans 集成开发环境在部署描述符中设置超时时间,请按照下列步骤操作。

打开项目如果你还未打开
展开你的项目 Projects 节点
展开项目节点下的 Web Pages and WEB-INF 节点
双击 web.xml
在编辑器顶端点击 General 按钮
在 Session Timeout 属性中,键入数字整数值表示在会话超时之前必须经过的不活动分钟数。

session 跟踪
要将 session 与用户关联,web 容器有几种方法,它们都需要在客户端与服务器直接传一个唯一标识。这个唯一标识在客户端作为一个 cookie 维护,或者 web 组件在返回客户端的每一个响应中包含这个唯一标识。如果你的应用使用了 session 对象,您必须确保在客户端关闭 cookie 时让应用程序重写 URL,从而启用会话跟踪。你可以通过调用所有 servlet 的响应的 encodeURL 方法来实现。只有当 cookie 无效时,这个方法才在 url 中包含唯一标识;从另一个角度讲,这个方法返回的 url 不会改变。

退出移动版