session cookie详解.

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

你可能感兴趣的:(session cookie详解.)