通常所说的cookie实际上可以分为2种,一种是由Cookie对象产生的保存在客户端硬盘上的持久化的cookie,另一种就是由session对象产生的保存在浏览器内存里的session cookie.session cookie的组成是形如: JSESSIONID=0EB8CEDE030A4B6FB5366317D8BF1978(tomcat下).Session cookie何时产生?当新创建一个session对象时产生session cookie.当使用request.getSession()或request.getSession(true)方法时,如果请求范围内根据jsessionid能够找到一个对应的session对象,则不产生session cookie也不返回给客户端保存,找不到则新创建一个session cookie并生成一个形如JSESSIONID=0EB8CEDE030A4B6FB5366317D8BF1978(tomcat下)的session cookie并放在本次响应头信息中返回给客户端保存,客户端之前保存的session cookie也将被这个session cookie所代替.与session cookie不同的是,如果服务器端明确使用Cookie类来生成的持久化cookie将在每次响应中返回给客户端保存,不管客户端是否存在这个cookie.当浏览器接受cookie后(不管是持久化cookie还是session cookie),在对同一站点进行访问时,会自动把这些cookie信息放在请求头信息中一起发送给服务器端.这样服务器端就能得到这些cookie来跟踪会话.向服务器端发送cookie这个过程对用户来是完全透明的,是浏览器自动进行的.
以上讨论是在浏览器接受cookie的情况下,下面谈谈浏览器禁用cookie的情况.
如果浏览器禁用了cookie,那么浏览器不会接收保存服务器端存在响应头中的cookie信息(ie6有bug,会保存session cookie).浏览器再次访问同一站点时,请求头信息里也不会携带任何cookie信息的(因为浏览器根禁止了该功能).正因如此,服务器端接收不到客户端的cookie信息,也就无法识别客户端的身份,从而把它当作一个新的客户对待,也就会丢失以前的会话信息.在这种情况下服务器端使用request.getSession()或request.getSession(true)方法时将会重新创建一个session.那么如何在用户禁用了cookie的情况下维护会话呢?以上讨论我们已经知道,服务器端判断是新的会话还是旧的会话是根据请求头中是否有一个jsessionid的.由于浏览器禁用了cookie从而不会自动向服务器发送这个参数,那么要维持会话就需要我们自己每次服务器发送请求时带上这个参数.url重写正是这样一种技术,只要在我们的代码中把所有向服务器发送请求的地方用response.encodeRedirectUrl(String arg0)包装一下,这样我们请求的url就会自动加上当前session对象产生的jsessionid.服务器端也能取得这个值从而识别客户端.