servlet之session简介_动力节点Java学院整理
servlet之session简介
在Web开发中,session是一个很常见的概念,也是一个比较重要的概念。
Session是指在Web服务器端保持用户信息的一种机制。当用户 次访问一个Web站点时,Web服务器会为该用户创建一个 的会话标识符(例如一个随机生成的字符串),同时在Web服务器端创建一个用户会话对象,用来存储客户的状态和数据。这个会话标识符会被传送给客户端浏览器,并通过Cookie或URL Rewriting等技术保存在客户端。当客户端再次访问该Web站点的其他页面时,该会话标识符会被取回并传回Web服务器,Web服务器可以通过这个会话标识符找到与该标识符相关联的Session对象,从而恢复客户的状态和数据。
Session具有以下特点:
1、Session对象是在Web服务器端创建的,与用户的浏览器无关,因此能有效地避免Cookie被禁用的情况。
2、Session对象在Web服务器端存储,因此可以存储任何类型的数据,包括对象、类、数组等等。
3、Session对象的生命周期可以通过Web服务器控制,一般默认30分钟,超过指定时间后服务器会自动销毁该Session对象。
Session对象的用法:
在Java Servlet中,session是一个javax.servlet.http.HttpSession接口类型的对象,可以通过HttpServletRequest对象的getSession()方法取得。
HttpSession session=request.getSession();
如果请求中没有session对象,则自动创建一个新的session对象,并返回该对象;如果请求中已经存在session对象,则返回该对象。
HttpSession对象提供了以下方法:
1、void setAttribute(String name,Object value)
向session中存储一个属性
2、Object getAttribute(String name)
从session中获取一个属性
3、Enumeration getAttributeNames()
获取session中存储的所有属性名
4、void removeAttribute(String name)
删除session中指定的属性
5、long getCreationTime()
获取session的创建时间,以毫秒为单位
6、String getId()
获取session的标识符
7、long getLastAccessedTime()
获取session的最后一次访问时间,以毫秒为单位
8、int getMaxInactiveInterval()
获取session的最长不活动时间间隔(以秒为单位)
9、void setMaxInactiveInterval(int interval)
设置session的最长不活动时间间隔(以秒为单位)
10、void invalidate()
无效session,释放所有的资源
例如: 在servlet中:
//将数据保存到session中
HttpSession session=request.getSession();
session.setAttribute("name","Tom");
String name=session.getAttribute("name");
session.removeAttribute("name");
long time=session.getCreationTime();
time=session.getLastAccessedTime();
session.setMaxInactiveInterval(1800);
session.invalidate();
当然,在使用Session的过程中,还需要考虑到Session的安全性和性能问题,下面简单介绍一下:
1、安全问题:
Session会在用户访问Web站点的过程中不断地传递,如果不加以保护,会有一些安全问题:
(1)Session劫持问题。攻击者通过一些手段获取其他用户的Session ID,然后自己使用此ID,以此来获得其他用户的权限和数据。
(2)Session固化问题。如果Session中包含了敏感数据,会有人想把这些数据偷取出来,这时攻击者可以通过各种方法使自己的Session ID得到保存,接着再次利用此ID来获取敏感数据。
(3)Session超时问题。默认情况下,Session会在创建后30分钟内没有任何访问请求,将被Web服务器自动销毁。也就是说,如果客户端没有在这个时间段内访问Web站点,他的Session ID将会被失效,但是如果Session中包含的数据是敏感数据,可能会受到攻击者的攻击。
(4)Session过期问题。当Session过期,数据就会清除,如果在此时操作则可能出现错误。这时,我们应该考虑清除Session对象,以避免出现异常。
为了保证Session的安全性,应该做到以下几点:
(1)Session ID的传输必须加密。
(2)Session ID的生命周期必须短暂。
(3)Session ID应该随机生成。
2、性能问题:
Session是基于内存的,如果系统中的Session过多,会使Web服务器的内存占用过高,导致系统缓慢,访问速度变慢。为了避免这种情况,可以采用以下方案:
(1)限制Session对象数量。可以设置最大容量,当Session数量超过指定数量时,就禁止创建新的Session。
(2)限制Session对象的生命周期。如果某个会话长时间没有使用,就将其设置为过期状态,要释放它占用的内存。
(3)存储Session的数据必须精简,其它数据可用缓存技术,如redis等。
总的来说,Session是一个非常重要的Web开发机制,它不仅可以方便地存储用户数据,也可以提高Web应用系统的安全性和可靠性。因此,在使用Session的过程中,需要我们特别注意其安全性和性能问题。
