1. Session 基本概念
注:这里指的是浏览器 Session
Session 机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
通俗的说:客户端浏览器访问某个地址,发送了一个请求,就产生一个 Session 会话,现在的浏览器都可以打开多个 Tab 窗口,打开的都属于一个 Session,当该浏览器关闭的时候 Session 就关闭了。若不关闭该浏览器,再次打开一个浏览器,会重新创建一个 Session。
1.1 Session 在何时被创建
一个常见的误解是以为 Session 在有客户端访问时就被创建,然而事实是直到某 Server 端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果 JSP 没有显示的使用<%@page session="false"%>关闭 Session,则 JSP 文件在编译成 Servlet 时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true),这也是 JSP 中隐含的 Session 对象的来历。
由于 Session 会消耗内存资源,因此,如果不打算使用 Session,应该在所有的 JSP 中关闭它。
1.2 Session 何时被删除
综合前面的讨论,Session 在下列情况下被删除:
程序调用 HttpSession.invalidate()
距离上一次收到客户端发送的 Session ID 时间间隔超过了 Session 的最大有效时间
服务器进程被停止
1.3 如何在浏览器关闭时删除 Session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用 JavaScript 代码window.oncolose 来监视浏览器的关闭动作,然后向服务器发送一个请求来删除 Session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
2. 报表 Session 与应用 Session
报表集成到项目中可能会有一个疑问就是系统应用和报表应用在一个 Web 服务器下,那系统 Session 和报表 Session 是不是一个 Session 呢?如果不是那会不会有冲突呢?
答案是:不是同一个 Session 也不会起冲突,因为应用的 Session 存放的是 request 请求等一些共享信息,而报表 Session 存放的是访问报表的相关信息,如访问的是不是同一个模板等,两者是完全独立,所以不会冲突。
3. FineReport 中创建与关闭 Session 机制
正常情况下,当客户端浏览器访问报表服务器端的某张报表时,便会产生一个 Session 会话,当用户关闭浏览器的时候就会通知报表服务器关闭这个 Session,但不会使保存在服务器端的 Session 对象消失,同样也不会使已经保存到硬盘上的持久化 Cookie 消失。
注:若到达 生命周期 后,会自动关闭相关 Session 。