文章目录
- 1.前言
-
- 1.1 会话(Session)的概念
- 1.2 Session的作用
- 2.Session
-
- 2.1 Session的实现原理
- 2.2 获得Session对象
- 2.3 Session对象的销毁
- 2.4 如果Cookie禁用了那么Session还能找到吗?
- 3.Servlet三大域
1.前言 1.1 会话(Session)的概念 会话是指一个终端用户与交互系统进行通讯的过程。比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。在我们的实际开发中Servlet规范了一个HttpSession类。
而这里我们说一下什么是请求(request):用户在浏览器上点击了一下,然后到页面停下来,可以粗略的认为是一次请求。一个会话常常包含了多次请求。
session机制属于B/S结构的一部分,这个机制实际上是一种规范,不同的语言都对这种机制进行了实现。
1.2 Session的作用 Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
那么为什么需要Session对象来存储会话状态呢?
- 首先我们要知道HTTP是一种无状态协议,什么是无状态?
- 无状态指的是客户端(Web浏览器)和服务器之间不需要建立持久的连接,当一个客户端向服务器发起请求后,服务器收到了请求并且返回响应结果,这次的通信就结束了,同时服务器不保留连接的相关信息。所以每次请求都需要包含所需的所有信息,这样消息结构会比较复杂,同时也会导致相同的数据在多个请求里反复传输,协议效率也会因此降低。
- 知道了什么是无状态我们就可以知道,我们的Web服务器跟浏览器是不建立持久连接的,只有当发送请求才会有连接(浏览器向服务器请求数据,服务器向浏览器返回数据),当请求结束以后连接就断开了,HTTP协议之所以这么做,是因为这样设计可以降低服务器的压力。
文章图片
- 在我们发送请求时,HTTP的报文会有会有这样一行:JSESSIONID=xxxxxx,这个就是该次会话的session对象的id,这个是以cookie的形式保存在服务器中的,至于cookie这里先不细说。如果我们的服务器关闭,这个cookie就没有了。
- Session列表是一个被保存在服务器中的列表(Map),map的Key是sessionid,Value是session对象。
- 用户的第一次请求,服务器会生成session对象,同时生成id,将id发送给浏览器,第二次发送请求时,浏览器自动将session的id发送给服务器,服务器会根据id查找session对象,当我们的浏览器关闭,cookie就会被销毁,但是session没没有销毁,一般来说session的销毁是由服务器完成的。
HttpSession session = request.getSession();
HttpSession session = request.getSession(false);
在一次会话中,我们使用getSession()方法,该方法中有一个可选参数(false)
- 如果没给参数,那么当我们发出request时,浏览器在服务器中查找该会话Session对象,如果没有找到会自动创建一个Session对象。
- 如果给了参数,那么当我们发出request时,浏览器在服务器中查找该会话Session对象,如果没有找到则不会创建Session对象。
- 超时销毁
- 当我们关闭浏览器以后,服务器并不知道我们的浏览器已经关闭,所以如果一个Session对象长时间没有被访问,服务器就会自动销毁。这个是session销毁的主要手段。至于多长时间算超时可以在web.xml文件中
- 手动销毁
- 如果你使用过网上银行,你可能会记得网上银行会有一个按钮叫安全退出,这里用的就是手动销毁session对象。
-
session.invalidate();
- 如果你使用过网上银行,你可能会记得网上银行会有一个按钮叫安全退出,这里用的就是手动销毁session对象。
如果cookie禁用了,session机制还是可以实现的。不过需要使用URL重写机制就是url中手动添加Session对象的id。
- http://localhost:8080/servlet12/test/session; jsessionid=19D1C99560DCBF84839FA43D58F56E16
- URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分的网站都是这样设计的:你要是禁用cookie,你就别用了。
关于前两个可以看看我的博客或者其他博主的博客,这里就不再细说。
【Servlet|Servlet学习之Session】在这里我们对比一下三者:
- 应用范围
- 应用域>会话域>请求域
- 应用域是属于项目级别的,对一个项目下所有的应用都生效。会话域是用户级别的,保留了一次会话状态,一个会话域可能包含多个请求域。请求域是仅对一次请求生效。
- 使用原则
- 尽量使用能满足业务需求最小的域,这样不会给服务器造成太大压力。
推荐阅读
- 单例模式|单例模式(饿汉式,dcl懒汉式)
- 常见的注解
- 高并发|JUC高并发编程(07) -- 多线程锁 -- 演示锁的八种情况
- #|Oracle数据库操作
- 云计算|云计算技术与应用 -基础概念与分布式计算
- 面试官(Nginx 是如何实现并发的(为什么 Nginx 不使用多线程?))
- 面试·求职系列|Java8新特性 十二大总结 (面试篇)
- 面试·求职系列|【面试篇】手写单例模式及原理剖析
- linux|前后端分离 -- Spring Boot + Vue实现视频管理系统 并部署阿里云服务器