1. Cookie
1.1 什么是 Cookie
Cookie 是存储于访问者计算机的变量,每当同一台计算机通过浏览器请求某个页面时,就会发送这个 Cookie。您可以使用 JavaScript 来创建和取回 Cookie 的值。
比如,当我们访问 sina 等邮箱时,会有一个选项提醒我们是否要保存账号和密码,如果选是,我们的账号和密码就被保存在了 Cookie 中。
1.2 使用方法
我们可以通过 document 对象的 Cookie 属性对当前文档的 Cookie 进行读取,创建,修改和删除操作。
1.2.1 返回 Cookie
我们可以通过如下代码返回当前文档的 Cookie:
document.write(document.cookie);
1.2.2 创建 Cookie
JSP 中我们可以创建一个可在 Cookie 变量中存储访问者姓名的函数:
function setCookie(c_name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}
c_name 为姓名,value 为值,expiredays 为过期天数。
1.2.3 检查 Cookie
下面函数首先会检查 document.cookie 对象中是否存有 Cookie。
假如 document.cookie 对象存有某些 Cookie,那么会继续检查我们指定的 Cookie 是否已储存。
如果找到了我们要的 Cookie,就返回值,否则返回空字符串。
function getCookie(c_name)
{
if (document.cookie.length>0)
{
c_start=document.cookie.indexOf(c_name + "=")
if (c_start!=-1)
{
c_start=c_start + c_name.length+1
c_end=document.cookie.indexOf(";",c_start)
if (c_end==-1) c_end=document.cookie.length
return unescape(document.cookie.substring(c_start,c_end))
}
}
return ""
}
2. Session
2.1 Session 基本概念
注:这里指的是浏览器 Session
Session 机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
通俗的说:客户端浏览器访问某个地址,发送了一个请求,就产生一个 Session 会话,现在的浏览器都可以打开多个 Tab 窗口,打开的都属于一个 Session,当该浏览器关闭的时候 Session 就关闭了。若不关闭该浏览器,再次打开一个浏览器,会重新创建一个 Session。
2.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 中关闭它。
2.1.2 Session 何时被删除
综合前面的讨论,Session 在下列情况下被删除:
程序调用 HttpSession.invalidate()
距离上一次收到客户端发送的 Session ID 时间间隔超过了 Session 的最大有效时间
服务器进程被停止
2.1.3 如何在浏览器关闭时删除 Session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用 JavaScript 代码window.oncolose 来监视浏览器的关闭动作,然后向服务器发送一个请求来删除 Session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
2.2 报表 Session 与应用 Session
报表集成到项目中可能会有一个疑问就是系统应用和报表应用在一个 Web 服务器下,那系统 Session 和报表 Session 是不是一个 Session 呢?如果不是那会不会有冲突呢?
答案是:不是同一个 Session 也不会起冲突,因为应用的 Session 存放的是 request 请求等一些共享信息,而报表 Session 存放的是访问报表的相关信息,如访问的是不是同一个模板等,两者是完全独立,所以不会冲突。
2.3 FineReport 中创建与关闭 Session 机制
正常情况下,当客户端浏览器访问报表服务器端的某张报表时,便会产生一个 Session 会话,当用户关闭浏览器的时候就会通知报表服务器关闭这个 Session,但不会使保存在服务器端的 Session 对象消失,同样也不会使已经保存到硬盘上的持久化 Cookie 消失。
注:若到达 生命周期 后,会自动关闭相关 Session 。
3. cookie跟session之间的关系
3.1 Cookie 机制和 Session 机制的区别
具体来说 Cookie 机制采用的是在客户端保持状态的方案,而 Session 机制采用的是在服务器端保持状态的方案。同时我们也看到,由于服务器端保持状态的方案在客户端也需要保存一个标识,所以 Session 机制可能需要借助于 Cookie 机制来达到保存标识的目的,但实际上还有其他选择。
3.2 Cookie 的过期和 Session 的超时有什么区别
会话的超时由服务器来维护,它不同于 Cookie 的失效日期。首先,会话一般基于驻留内存的 Cookie 不是持续性的 Cookie,因而也就没有截至日期。即使截取到JSESSIONID Cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。当用户关闭了浏览器虽然 Session、Cookie 已经消失,但不会使保存在服务器端的 Session 对象消失,同样也不会使已经保存到硬盘上的持久化 Cookie 消失。