cookie和session的工作机制简单剖析:
首先说明为什么会使用cookie和session,HTTP协议时无状态的,即一次请求和相应之后,客户端和服务器端之间不再保持连接,那么我们经常的WEB应用中,经常在客户端看到我们以前访问的信息,就是通过cookie或session实现的。二者都是通过键值对的形式保存信息的。
1)cookie
cookie分为两种:
第一种,没有生命周期的cookie。这种cookie和浏览器紧密相连,当浏览器关闭时,cookie失效。同时不同的浏览器窗口不共享cookie。其实就是把cookie放入到内存当中。例如打开一个IE窗口,向服务器发送一次请求,服务器建立一个cookie,那么只能在这个窗口中,或者在这个窗口中打开一个新的窗口中,能获得cookie的信息;如果新打开一个IE,则拿不到cookie中的信息。这种cookie还有一个特性:url目录中可以获取它所有父目录中的cookie,但是拿不到它的子目录中cookie信息。
第二种,有生命周期的cookie。当cookie有了生命周期,他就会以文件的形式存在于客户端。例如将用户登录的用户名和密码保存在客户端文件中。
2)session
session保存信息的地方与cookie相反,它把信息保存在服务器端。session即会话,指客户端与服务器端的一次会话。但是HTTP是无状态的,怎样保持会话呢?其实session就是通过使用无生命周期的cookie来实现的。当session创建完毕,返回客户端时,会将一个sessionID传给客户端,保存在内存当中,同时服务器端也将此sessionID保存。当客户端再次访问时,会把客户端的sessionID传给服务器端,若客户端的sessionID和服务器端的sessionID一致,即认为是同一session。
session和浏览器的关系与cookie与浏览器的关系一致。但没有父子目录的特性。
session的生命周期,虽然客户端在关闭浏览器之后,他与服务器端的session断开,但是用户的信息依然在服务器端占用资源。我们可以通过两种方式结束session。第一,在WEB容器中,例如在tomcat的conf目录的web.xml文件中配置,这样,在此tomcat种放置的项目的session过期时间都被设置;第二,在项目的web.xm文件中设置,这种方式只针对项目本身的session有效。
3)用户禁用cookie
若用户禁止了cookie,那么session也会被禁止。此时若使用session,可以通过URL重写来实现。即用HttpServletResponse对象的encodeUrl();方法重写URL,这是sessionID会作为参数出现地址栏。