Session

总结

1.Cookie是保存在客户端的,Session是保存在服务端的
2.Session的创建,因为session是存在服务端的,所以不需要像cookie一样发送到客户端
但是在底层,其实是创建了一个cookie,并将sessionid存入cookie,返回到客户端

  • 创建并存入数据
    request.getSession();
    sess.setAttribute(name,obj)
    sess.getAttribute(namej)
    sess.getAttributeNames()
    sess.removeAttribute(name);

3.当浏览器关闭,或者删除了cookie后,请求时将不会再携带cookie(以及其中的session),此时虽然服务器中的session还存在着,但其实已经失效了,等过了30分钟的有效期会自动被销毁

4.通过session创建的cookie的domian+path+name都是默认的,也就代表了在同一个浏览器中,在session有效期内,多次请求同一个web项目下的内容获取到的session是同一个,

1.session原理

1.当mary的浏览器向服务端的ServletDemo01发起的请求需要保存一些数据时,而且数据保存在服务端时,可以调用request.getSession()在服务端创建一个session对象.底层的实现过程为Tomcat在内存中生成一个叫做sessionid的随机的字符串,通过这个sessionid,在服务端为mary的本次会话关联一个session对象,session对象中有各种属性,其中还封装了一个空map对象(用于存放程序运行过程也能够中产生的数据)
Session
2.当tomcat对本次请求进行响应时将内存中生成的sessionid在响应头以cookie的形式发送到浏览器端
Session
Session
3.当tomcat对本次请求进行响应时,将sessionid在响应头中以cookie的形式发送到浏览器端,此后当浏览器再次向服务端的Sevlet01发起请求时,会将sessionid再次发送到服务端,tomcat通过sessionid,就可以找到在服务端为mary开辟的服务端的session对象
Session
Session
4.当jack的浏览器向服务端的ServletDemo01发起请求需要为jack的会话保存数据时,tomcat也为jack的会话创建sessionid,和sessionid对应的在服务端也会有一个session对象和jack的会话关联,以后再jack和浏览器的多次请求响应中,都维护了sessionid,通过这个sessionid就可以找到服务端为jack建立的session对象,就可以向session中存放键值对的数据
Session
5.此后只要jack和mary的浏览器没有关闭的前提下,对服务端的其他动态资源访问时,就可以将各自维护的sessioinid发送到服务端,那么tomcat就可以通过这个sessionid获取到为jack和mary建立的session对象,就可以向其中存储和获取各自独立的数据
Session

2.获取session的实现过程

获取session的方法是:request.getSession();

执行过程为:tomcat看本次请求的请求头是否通过请求头携带过一个sessionid

  1. 如果没有,新建一个随机的字符串,并创建一个和这个随机字符串关联的session对象.
  2. 如果有,通过这个随机的字符串看内存中是否已经存在一个和其相等的字符串
    • 存在,说明之前创建过session对象,那么获取到这个session对象返回即可.
    • 不存在,说明之前的session已经销毁或者是用户在伪造session则在服务端没有一个和这个字符串的值相等的字符串,此时新建一个随机的字符串,并创建一个和这个随机字符串关联的session对象.

3.Session的本质

服务端为各个不同的客户端创建了一个对象,这个对象在服务端,用来保存来自各个客户端的数据

1.Sssion的生命周期
创建:当用户访问服务端时,首次碰到request.getSession()
销毁:
1_服务器非正常关闭
2_session超时(默认30分钟,可以配置)
3_session销毁
注意:
服务器正常关闭,session对象不在内存中,被序列化到硬盘上, 此时重新启动服务器,
还是可以将session加载到内存中的

2.何为一次会话?
客户端和服务端交互过程中,session有效期期间的请求响应为一次会话.

3.浏览器关闭:
sessionid是以cookie的形式来实现的,而且对应的cookie是会话级别的,有效期为0.浏览器关闭,随机的字符串将无法向服务端传递.

4.API

创建
request.getSession();

向session中放入数据
session.setAttribute(name,obj)
session.getAttribute(namej)
session.getAttributeNames()
session.removeAttribute(name);

销毁session
session.invalidate();

获取上次访问时间
session.getLastAccessTime(); //获取上次访问时间

获取创建时间
session.getCreateTime()


API测试

Session
浏览器中显示如下:
Session
Session
我们查看浏览器中的cookie,发现
Session

此时,我们请求servletDemo02,因为cookie的path是当前项目,所以在请求servletDemo02时,也会携带cookie
Session

5.案例:验证码一次校验

原理分析
Session

其它知识点

1.Cookie/session区别
存储的位置不同:cookie客户端浏览器,session服务端的内存
存储的数据的大小不同:cookie限制,session服务端内存大小限制
安全性:cookie不安全,session安全

2_cookie和session的选取
什么是会话?
客户端和服务端的多次请求响应交互过程一次会话.