Session是J2EE协议中五个对象之一,其它四个为Request, Response, Cookie, Application。下面对session做一个说明。
Session在服务器中产生,由web服务器维护其生命周期,例如Tomcat, JBoss, Weblogic等,它们都实现了J2EE协议,虽然在创建session时,略有差别但是都遵循J2EE协议。下面从J2EE协议的角度说明。
Session对象,是为了维护一次会话的状态,保证本次会话不会与其它会话冲突。所谓会话,是客户端通过请求服务器,服务器返回给客户端,到此一个会话建立,之后这个会话下的所有操作都将共享该Session对象。比如:我们登陆淘宝网,请注意如果此时我们没有使用session,该session对象是不会产生的。当然这里有两种情况,如果是淘宝网要在session中记录一些信息,session就产生了,此时我们输入自己的基本登陆信息,就可以共享该session。如果是我们登陆的时候使用session,那么当登陆完成后,在淘宝网界面的所有操作都可以共享该session记录一些信息。最常见的是购物车,我们可以利用该session,保存自己的购物信息,这样结算的时候看到的就是自己购买的物品,当然其他用户访问的时候会用他自己的session不会和咱们的session冲突。
网上好多人说,只要关闭浏览器session就会消失,这是完全错误的,session是由服务器产生,生命周期由服务器维护,我们可以自己定义session的失效时间。到时间后服务器会清理将其销毁。
说到这里不得不说下sessionid这是唯一标识session对象的东西,通过该值服务器可以找到对应的session,请注意是服务器去找session而不是客户端,诸如浏览器之类的。sessionid是服务器产生的,其保存方式一般是写到cookie中,以键/值对的方式。Key=JSESSIONID,VALUE=SESSIONID。
既然提到了cookie,那么就说明session和cookie的区别及联系。这本就是两个对象,cookie对象是服务器端产生,但是却保存在客户端的一个小文本中,这就是常说的cookie是一小段保存在客户端的文本。正是有了cookie我们可以在访问网站的时候不需要拼接sessionid,其原理如下:
1、http请求服务,创建session
2、返回给浏览器,其中有cookie信息,cookie中有sessionid信息
3、浏览器接受到cookie信息,将其写到某个目录的文本中
4、不关闭浏览器,再次http请求,此时浏览器会将sessionid发送给服务器
5、服务器拿到sessionid,从其request的session对象队列中找到与该sessionid一直的session对象,使用该session工作。
如果禁用cookie,那么我们需要每次都传递sessionId,所谓的Url重写,格式如下:
http://localhost:8080/projectName;jsessionid=cj13nd83rn;dfl
此时服务器会解析该url找到sessionid然后拿该sessionid去request的session队列中找到该sessionid对应的session
如果我们不重写url那么会出现无法使用我们session的问题。
例如:我们访问163邮箱,首先不禁止cookie登陆 进去,此时点击里面的收件箱没有问题,因为我们使用的是自己的session,然后禁止cookie,此时点击收件箱会提示您的状态已经过期,不是session销毁了,而是无法找到一个匹配的session因此拿不到我们的基本信息而给出提示。如下图注意红色提示:
但是开启cookie的同时,如果我们拼接sessionid,如果cookie中有sessionid,那么服务器会将cookie中的sessionid覆盖重写的sessionid,此时会使用覆盖的sessionid去request的session队列中找到与之对应的session自然不是我们要的session。原理如下图: