session的使用
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
sessionid 当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie JSESSIONID= nj1tvkclp3jh 83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.
二、session的工作原理
1、session的生命周期
- 客户首次访问服务器的一个页面时,服务器就会为该用户分配一个session对象,同时为这个session指定唯一的ID,并且将该ID发送到客户端并写入到cookie中,使得客户端与服务器的session建立一一对应的关系;
- 当客户端继续访问服务器端的其它资源时,服务器不再为该客户分配新的session对象,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效,客户端与服务器的会话结束。
- 当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个session对象,并重新分配sessionID。
-
2、session失效的原因
- session本身有一个存活时间,在tomcat中默认的是30分钟,和浏览器是没有关系的,因为即使你浏览器一直开着,如果在30分钟内没有发出任何请求,那你原来存在服务器上的session域内的东西就全没有了,你再次访问的时候,服务器会新建一个session的。通过session的ID来判断是不是新的session,session时间的改变是通过session.getMaxInactiveInterval()改变的。
- 调用invalidate()
- 服务器重启或者中断
-
注意:
浏览器会将sessionid放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个session将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
三、session的使用
1、session的方法
- public void setAttribute(String name,String value)设定指定名字的属性的值。
- public Object getAttribute(String name)在会话范围内获取指定名字的属性的值。
- public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
- public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
- public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
- public void setMaxInactiveInterval(int interval) 设置会话的最大持续时间,单位是秒,负数表明会话永不失效。
- public int getMaxInActiveInterval(),获取会话的最大持续时间,当值为-1时永远不会失效,只有当服务器重启时才会失效
- 使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
2、获得session对象,主要有两个方法
(1)一是通过HttpServletRequest对象来实现
- reques.getSession(true)等同于request.getSession();意味着若存在会话,则返回该会话,否则创建 一个新的会话,并返回新创建的会话。
- request.getSession(false)意味着当若存在该会话则返回该会话,否则返回null。
注意:session是需要占用服务器资源的,除非会话一定不存在或必须要创建,不然的一般 最好使用request.getSession(false)。在正常情况下可以通过在session中创建一个参数,通过获得该参数是不是为null来判断该会话是否存在。若为null则不存在会话,否则存在。
private boolean ifExistsSession(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session != null) { //获得sesison中创建的变量 if (session.getAttribute("name") != null) { return true; } } return false; }
(2)通过pagecontext对象来xt获取,pageContext.session();
本着总结分享学习经验的原则,如有不对请指正