一.什么是Session
Session是服务器端的缓存技术,它是基于内存的,可以用来保存针对每个用户的相关数据。
换句话说:程序员可以通过session,把以后还会用到的数据放到服务器内存中。
这些数据可以按照不同的会话来分类,会话A和会话B的数据会放在不同的session对象中。
二.Session的生命周期
session的创建:
session由服务器创建,当后端程序调用getSession(true)的时候,session才可能会被创建(当请求中携带有JSessionId时,不会创建)。
当然,如果程序从头到尾都没有调用getSession(true)这句话,那么session就不会被创建。
比如:当用户访问web项目根目录下的一个静态html页面的时候(与web-info同级的页面),服务器是不会为用户创建session的。
这里面有两个问题需要说明一下:
1. getSession()、getSession(true)和getSession(false)的区别
getSession()和getSession(true)是一样的,意思是:若当前会话在服务器中没有对应session的时候,则为当前会话创建一个session,并返回新建的session对象的引用。
getSession(false)则不是这样:若当前会话在服务器中没有对应session,则返回null,并不会创建session对象。
2. 当我们访问jsp页面的时候,即使代码中没有写getSession()和getSession(true)方法,服务器依然会创建session。
这是因为:jsp被访问之前会被翻译成servlet,翻译过程中默认会调用HttpServletRequest.getSession(true)方法~
session的销毁:
session是有有效期的,具体时间由服务器指定,比如:tomcat中session的默认有效期是30分钟,这个时间可以通过修改服务器或项目中的配置文件来调整。
当用户关闭浏览器的时候,当前会话对应的session就不会再被使用了。但是服务器并不知道用户是否已经结束当前会话了,所以它并不会马上销毁session,
而是会等待session过期后再将其销毁。另外,我们也可以通过session的inviladate()方法来立即销毁某个特定的session。
也就是说,session的销毁主要有两种方法:过期后自动销毁、调用inviladate()方法即时销毁。
三.服务器如何区分不同用户的session
服务器会为多个会话创建不同的session,每个session都会有一个唯一性标识:JSessionId。JSessionId是一串字符串,通常是以cookie的形式保存在http请求和响应中。
服务器处理http请求时,会从HttpServletRequest对象的cookie中搜索JSessionId,再根据JSessionId从内存中取出对应的session对象。
由于不同的用户,使用的JSessionId不一样,所以对应的session对象就不一样。这样不同用户之间的数据就不会混淆了~
四.Session的应用场景
session经常会被用来维持用户的登陆状态。
当一个用户输入账号密码登陆服务器后,服务器会校验用户的帐号密码。校验成功后,会将用户的相关信息写入session中,作为用户已登陆的凭证。
当该用户再次向服务器请求数据时,服务器会检查用户当前会话对应的session中是否记录了用户相关信息。如果有记录,则说明用户已经登陆过;
如果没有记录,说明该用户没有登陆或者登陆的信息已过期,此时会要求用户去登陆~
因为session是有有效期的,所以当web用户长时间不操作导致session过期后,我们会发现用户已经掉线了。
解决session过期的问题有多种方法,比如:
一。在js代码中,通过ajax定时向服务器发一个异步的空的请求,在session过期之前刷新它,确保session不过期。
二。延长session的有效期(这样会增加服务器的内存负担,不推荐)。
三。使用token来代替session做身份校验。