关于session的一点认识

一.什么是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做身份校验。

 

posted @ 2017-04-05 14:27  醉、、影  阅读(325)  评论(0编辑  收藏  举报