嗨,伤心了,Session的创建和销毁不是说过吗?当客户端发出第一个请求时(不管是被访问网站的任何页面)就会在此站点的服务其中开辟一块内存空间,这块内存就是session,session的销毁有两种方式,一种是session过期时间已到,会自动销毁(注意这里不是马上就会销毁,具体销毁时间由Tomcat容器所决定)。在我们项目中的web.xml中就可以配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
表示设置session过期时间为30分钟。值得注意的就是上面说的即使30分钟到了session不一定会马上销毁,可以通过session监听器测试得到每次session销毁的时间都不一样。如果要想安全的话就用下面第二种方法。在Tomcat的conf文件夹中的web.xml中可以找到Tomcat默认的session过期时间为30分钟。如果我们在我们的站点中配置了session过期时间Tomcat容器会以站点配置为主,如果我们没有在站点中配置session过期时间,将会以Tomcat下conf文件夹下的web.xml文件中配置的session过期时间为准。
第二种销毁方式通过手工方式销毁,这种销毁方式会立刻释放服务器端session的资源,我们手动销毁可以通过session().invalidate()实现。
session必须要销毁吗,为什么?
Session,作为我们离不开的后台的技术,它的出现主要是为了解决 Http 协议的 无状态 特点,用于解决用户状态的存储问题,而往往对于存储来说都会涉及到一个时间问题,下面我们来看看它的销毁方式到底有哪些。
默认时间到期
自己设定到期时间
立刻失效
关闭浏览器
关闭服务器
当客户端第一次请求 servlet 并且操作 session
时,session 对象生成,以 Tomcat 为例,Tomcat 中 session 默认的存活时间为
30min,即你不操作界面的时间,一旦有操作,session 会重新计时。那么 session 的默认时间可以改么?答案是肯定的。可以在
Tomcat 中的 web.xml 文件中进行修改。如下图:
当然除了以上的修改方式外,我们也可以在程序中自己设定 session 的生命周期,通过 session.setMaxInactiveInterval(int)来设定 session 的最大不活动时间,单位为秒。
HttpSession session=req.getSession()session.setMaxInactiveInterval(5)
当然我们也可以通过 getMaxInactiveInterval()方法来查看当前 Session 对象的最大不活动时间。
或者我们也可以通过 session.invalidate()方法让 session 立刻失效。
session.invalidate()
session 的底层依赖 cookie
实现,因为不同用户访问服务器要判别到底是使用哪个 session,所以当用户第一次访问服务器的时候往往会把一个 session id 通过
cookie 存储到用户端,并且该 cookie 的有效时间为关闭浏览器,从而 session 在浏览器关闭时也相当于失效了(因为没有
session id 再与之对应)。如下图,关闭后再打开,重新给浏览器分配了个 session id。
需要注意的是这里只是 cookie 失效了,你再访问相当于服务器把你当成了新用户,又给你创建了一个 session,并没有把之前的 session 对象销毁。
当非正常关闭服务器时,session 销毁;当正常关闭服务器时,session 将被 序列化 到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,如果对象被保存在了 session 中,服务器在关闭时要把对象序列化到硬盘,这个对象就必须实现 Serializable 接口,下次启动服务时,自动加载到内存。如下图,正常关闭后可以看到文件夹中多了一个 SESSIONS.ser 文件,再次启动服务器则文件消失。
从图中除了看到 Cookie 的名称和内容外,我们还需要关心一个信息, 到期时间 ,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int expiry)方法设定 cookie 的最大有效时间,以 秒 为单位。
大于 0 的整数,表示存储的秒数;若为负数,则表示不存储该 cookie;若为 0,则删除该 cookie。
负整数 :cookie 的 maxAge 属性的默认值就是 -1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
正整数 :表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
零 :cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0) 来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
java中Session针对单独对象的销毁
======一般手动销毁是在退出登录状态的情况下的,所以不是必须要销毁的
我们利用HttpSessionListener 接口来监听session的创建和销毁,从下图可以看出,当我们关闭服务器时,session并没有调用他的sessionDestroyed方法.
2. 即当我们关闭客户端浏览器时,Session并没有被销毁,还在服务器端,只不过客户端一旦把浏览器关闭掉以后,再去开一个新的窗口,之前的SessionID就再也访问不到了,因为SessionID是通过Cookie保存在浏览器进程中的,浏览器一旦关掉,所对应的Cookie也就消失了,当你把浏览器窗口关闭时,客户端并没有想服务器发送任何请求,服务器也收不到客户端提交过来的任何东西,所以服务器的那个Session依然还在那里存活着,当你在重新开一个窗口时,服务器会针对这个新的页面,发送一个新的SessionID,这个新的SessionID显然跟以前那个SessionID是不一样的,两者之间没有任何关系,这样客户端就会对应一个新的session上,而服务器端原有的那个会话则一直存在,一直等到超时,服务器端的session就销毁掉了。
PHP中,怎么才能关闭浏览器后自动销毁session?
removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
session对象的销毁的方法:手动销毁、配置文件设置时间销毁。
1 当需要在程序中手动设置Session失效时,可以手工调用方法,摧毁session。
removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
2 session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间。
php的session过期机制是由这三个配置决定:
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
过期时间是针对session文件最新修改时间的,如果最新修改超过了gc_maxlifetime的时间,gc会有1/1000分之一的概率回收(删掉session文件)
而每次浏览器请求,都是cookie中带了PHPSESSID去服务器中匹配session的
http请求是无状态请求,你一次请求后得到了响应,再没有其他请求的话,基本服务器跟你浏览器没啥关系了,所以你关闭了浏览器,不可能去命令服务器主动销毁session
要想实现你要的效果,只能设置cookie的过期时间了,关闭会话后cookie过期(一般不设过期时间,默认是关闭浏览器失效),这样,你再打开,就要重新登录,不要关心session的过期了,让gc自己回收把。
以上就是关于jsp中的session怎么销毁?全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!