Session

一、概念

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中,这个对象就是HttpSession

二、使用步骤

HttpSession对象的方法

  1. Object getAttribute(String name)
  2. void setAttiribute(String name,Object value)
  3. void removeAttribute(String name)

步骤

  1. 获取HttpSession对象:HttpSession session = request.getSession()
  2. 使用HttpSession对象:Object getAttribute(String name)void setAttiribute(String name,Object value)void removeAttribute(String name)

举例说明

先创建session对象,然后使用session对象存储数据
Session
然后在另一个servlet中创建新的session对象,然后使用新创建的这个session对象获取数据
Session
最终的到的结果为
Session

注意

如果我们关闭浏览器再次访问sessionDemo2,或者打开别的浏览器访问sessionDemo2,控制台的到的结果为null

如图所示
Session
因为只有在一次会话当中的多次请求才能共享数据,如果不是一次会话的话那么则获取不到数据

三、原理分析

服务器如何确保在一次会话范围内,多次获取的Session对象是同一个?

首先我们要知道一个结论Session是依赖于Cookie的,然后我们根据图片说明详细分析这个过程
Session
首先,在浏览器第一次访问SessionDemo1资源的时候,是第一次获取Session,这时候还没有有关的Cookie,然后会在内存当中创建一个新的Session对象,并且给这个对象设置一个id假设为742938a4289。然后会在第一次响应浏览器的时候设置响应头为set-cookie他的name为SESSIONID,value就是刚刚我们创建的session对象的时候设置的id值。(如图所示第一次访问)
Session
这时候经过第一次访问SessionDemo1已经创建了保存session对象信息的Cookie了,然后我们进行第二次访问我们浏览器的请求头中会携带着刚刚上一次响应中的cookie,(如图所示访问第二个servlet资源)
Session
传递给SessionDemo2,然后SessionDemo2中获取到session对象,通过刚刚请求头中传递过来的有关session对象的信息进行查找,也就是通过那个id进行查找,找到后指向那个session对象,这样就保证了两次获取的session对象都是同一session对象了。

结论:Session的实现是依赖于Cookie的

四、有关问题

1、当浏览器关闭后,服务器端不关闭,两次获取的session是否为同一个?

① 默认情况下不是同一个

举例说明
Session
当关闭浏览器不关闭服务器的时候的控制台打印的到的结果为
Session
显然这两次创建的session对象不是同一个对象

② 但是我们也可以设置,当服务器不关闭浏览器关闭然后两次获取的到的对象是同一个,因为我们session是依赖于cookie的,我们可以设置cookie的存活时间来达到我们的目的

举例说明
Session

然后访问一次sessionDemo4,然后关闭浏览器再次访问sessionDemo4得到的结果如下
Session

2、当客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

不是同一个,因为服务器关闭后再次启动,获取到session即使一样,也是巧合,因为这个是随机分配的。虽然两次得到的session对象不是同一个,但是这里我们需要注意我们要保证数据不能够丢失,然后就涉及到了两个知识点

(1)session的钝化

在服务器正常关闭之前,将session对象序列化到硬盘上

(2)session的活化

在服务器启动后,将session文件转化为内存中的session对象即可

这里我们需要知道Tomcat已经默认帮我们完成了这两件事情,但是idea只完成了钝化,但是没办法活化

3、session什么时候被销毁?

(1)服务器关闭的时候
(2)session对象调用invalidate()方法
(3)session默认的失效时间是30分钟,但是可以通过web.xml中的<session-timeout-timeout><session-timeout>时间</session-timeout></session-timeout-timeout>这个标签来配置失效的时间

五、session的特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
  2. session可以存储任意类型,任意大小,想存多大就存多大只要内存放得下

session与cookie的区别

  1. seesion存储数据在服务器端,Cookie存储在客户端
  2. session没有数据大小限制,Cookie有
  3. session数据相对安全,cookie相对不安全

六、案例:验证码的案例

案例需求:

1、访问带有验证码的登录页面login.jsp

2、用户输入用户名,密码以及验证码

  • 如果用户名和密码输入有误,跳转登录页面,提示用户名或者密码错误
  • 如果验证码输入有误,跳转登录页面,提示:验证码错误
  • 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您

实现思路

Session

代码实现

目录结构
Session
login.jsp中代码实现
Session
Session
LoginServlet.java中的代码实现
Session
Session
CheckCodeServlet.java中代码实现
Session
Session

Session
succse.jsp中代码实现
Session

实现效果

Session
Session

这里只是大体进行了功能的实现,并没有解决一些细节性的问题