我们知道,会话是一种机制,用于跟踪客户状态的普遍解决方案。在网站上一系列的动作可构成一个会话,比如,登陆查看邮件系统,写信发信,最后退出,整个过程。
对于浏览器访问服务器来说,Servlet容器会创建HttpSession会话。当然,这前提是需要浏览器支持会话,可以在jsp中控制(而不是在浏览器中设置来控制,即不受用户控制,对用户是透明的)。会话不会一直存在,也会销毁。具体如下:
会话过期具有的意义:
1、长时间会话不活动,及时销毁,可以释放无效HttpSession对象占用的内存空间;
2、防止未授权的用户访问会话,当用户长时间不操作,会话结束,就要重新登陆(防止偷窥)。
注意: 即使web应用被终止,会话不会被销毁,而是被Tomcat持久化到永久性存储设备中,当web重启后,Tomcat会重新加载会话。(这些都不用开发者关心,Tomcat和Servlet容器替开发者做了太多的事情,甚至开发者都不知道,我以前就是这样,,太强大有木有)。
——————
对于JSP来说,Servlet容器提供了隐含的HttpSession对象,jsp可以直接通过固定引用变量来引用HttpSession对象,对√,就是直接用。你不用管它怎么创建的,甚至哪里来的,直接用!(当然,这些都是Servlet容器悄悄的帮你做了)
会话范围与HttpSession对象的生命周期对应,因此web应用如果能够共享一个HttpSession对象,也就能共享会话范围内的共享数据。
对于xxxServlet,可以从HttpServletRequest对象中获取HttpSession对象。
——————
session和cookie??
cookie是一种客户端和服务器端传输数据的一种手段,用于标识同一个session(比如JSESSIONID,它是cookie的一个key,用来标识一次session,cookie的value就是sessionid)。坦白的说,cookie什么都不是,只是一种名称,叫其他什么都无所谓,只是这种名称已经变成标准了。
延伸:
我们知道,HTTP是无状态的协议,而现在流行的微服务架构,都在讲无状态,上面的session和cookie的目的是为了达到有状态的会话,为了记录是哪个用户的哪个浏览器所执行的这一组操作。这不是矛盾吗??笔者现在的理解是,确实矛盾。通过前面的了解,如果浏览器首次访问时,服务器端会响应写一个cookie到浏览器,让后在这一个浏览器进程内,浏览器后面发的请求都会自动地(注意是自动的)带上服务器端生成的cookie。然而,使用过REST API编程或者postman客户端的童鞋都有经历,那就是这些都不能自动地保存服务器端生成的cookie,并且也不会再次访问时自动地带上。(客户端是什么样的永远不会影响服务器端的,服务器端该做什么该做什么,这里唯一变化的就是客户端变了,不再自动地的维持session了。导致这样一个问题,即使你连续的请求相隔时间再短,服务器端总会认为你是一个崭新的客户端,所以微服务就必须要做成无状态的,每一次请求都是独立的,因为它从本质上就不能够支持有状态,就不能够维持会话,你的所有的请求都必须毫不相干,起码不能有任何的会话的机制在里面)。
原来,浏览器也悄悄地帮你做了很多事情(都是HTTP的规约)。。。而这些事情像postman这样的rest客户端却没有帮你做,你自己编程访问rest api也没有做。
为什么?是不能做吗,肯定不是咯。我想可能有三点,一是增加开发的难度,加大了系统的复杂度;二是系统需要维护会话的开销,对于灵活小巧的微服务来讲,显然是相悖的;三是考虑到微服务应用所在的宿主机down掉了,不能在另一台宿主机迅速拉起就能服务,因为要为数据的一致性考虑,增加一致性解决方案。
以上均属于笔者臆想,不对之处,欢迎指正!