销毁session 在html页面写销毁session
本篇文章给大家谈谈销毁session,以及在html页面写销毁session对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
问题: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。
session必须要销毁吗,为什么
======一般手动销毁是在退出登录状态的情况下的,所以不是必须要销毁的
我们利用HttpSessionListener接口来监听session的创建和销毁,从下图可以看出,当我们关闭服务器时,session并没有调用他的sessionDestroyed方法.
2.即当我们关闭客户端浏览器时,Session并没有被销毁,还在服务器端,只不过客户端一旦把浏览器关闭掉以后,再去开一个新的窗口,之前的SessionID就再也访问不到了,因为SessionID是通过Cookie保存在浏览器进程中的,浏览器一旦关掉,所对应的Cookie也就消失了,当你把浏览器窗口关闭时,客户端并没有想服务器发送任何请求,服务器也收不到客户端提交过来的任何东西,所以服务器的那个Session依然还在那里存活着,当你在重新开一个窗口时,服务器会针对这个新的页面,发送一个新的SessionID,这个新的SessionID显然跟以前那个SessionID是不一样的,两者之间没有任何关系,这样客户端就会对应一个新的session上,而服务器端原有的那个会话则一直存在,一直等到超时,服务器端的session就销毁掉了。
c#销毁session
B/S程序都是有客服端发出请求服务器处理请求,不可能做到由服务器发出指令给客服端,所以你要做这个功能的话只能写一个方法,定时向服务器查询这一用户信息,当你修改了某一用户信息时,在服务端保存一个状态,你定是的查询这个状态,然后返回给客服端处理,大概思路就这样了
高级一点的话也许可以用TCP/IP编程来解决,但我没做过,所以给不了你什么好的意见
思路都这么清晰了,你还要代码啊,你在用户(user)表里面多加一列(如:change此列默认为false),当admin修改了某一个用户的信息时,修改此用户的change列的值为true,然后你在页面写一个方法,根据当前用户的username检索此用的change的值,然后你判断这个值,当值为false时则不做任何处理,直接return,当值为true时则清空session的值,并跳转到login页面,至于这个方法在什么时候调用,就是你自己的需要了,明白了?
在html页面写销毁session
LZ,我无语。<%%>是后台脚本,只有在页面初始化才会运行。而且他一般不调用void类型方法,而是用来返回值。既然只有初始化才能调用何必写在前台?后台不就行了。你那个exit.onclick是点击的页面按钮吧,你无非就是想点击那个按钮执行后台的方法,这个只有用ajax才能实现,如果用你那个方法就行,那ajax就没存在的意义了。而且据我所知,你应该用的.net吧,用ajax销毁session并不那么容易。
遇到这种问题,我建议你用另外一种方法,这也是我经常用的方法,新建一个页面,在里面写一个销毁session的方法,然后在主页面添加一个iframe并隐藏它,当你要销毁的时候,给ifranme赋值src属性(一句代码足以),js会自动加载ifranme,就达到了销毁session的目的。而且,如果你其他页面需要销毁session,只需要用同样的方法,这样既减少了代码量,也不需要在每个页面写繁琐的ajax。
文章分享到这里,希望我们关于销毁session和在html页面写销毁session的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。