Session会在打开浏览器任务栏消失关闭后消失吗

下次自动登录
现在的位置:
& 综合 & 正文
如何让用户在关闭浏览器后在1分钟后,Session失效
在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的页面,在不同的WEB路径下,所以转到登陆页面的URL都不同,每个页面都要调用和设置登陆页面路径,所以实际应用就放弃了这一想法后来考虑到不如写一个检查Session失效的页面,由客户端每一秒都刷新一下,就可以在一个页面中调用,但通过FRAME嵌入该ASPX老时有请求发出,不太好看,虽然该页面是隐藏的.再后来,想想,就用一个页面,使用无刷新技术,去请求该失效Session的页面就可以了,此处的无刷新技术使用了xmlhttp对象,没有使用WEBService技术.(由于客户的BS系统,使用FRAME框架,最上层的页面是显示软件名称,用户登陆信息的,所以调用就放在该页面中)
让我们来看看代码,主要是客户端的Javascript脚本程序
&script language="javascript"&
var idx=0;
function ChkSession()
var Http = new ActiveXObject("Microsoft.XMLHTTP");
Http.open("GET","ChkSessionOut.aspx",false); //检查Session失效的页面
Http.send();
var str = Http.responseT//执行ASPX后的返回结果
//document.all("ConvertResult").innerHTML = str+
if(str=="notnull")
//alert(str);
alert("会话值跟踪时间超时,请重新登录...");//这段代码一直没有运行,往下看,你就知道了
location.href = "longin.aspx";
window.setTimeout('ChkSession()', 1000 );//每一秒钟,请求一次ChkSessionOut.aspx
这段CODE,我放在&HEAD&&/HEAD&标签之间,然后在BODY加载时,调用该函数,如下:&BODY onload="ChkSession();"&
ChkSessionOut.aspx.cs的代码如下ChkSessionOut.aspx文件中的HTML标签全部被我删除,这样一来执行下面的代码,就只有结果的输出了
private void Page_Load(object sender, System.EventArgs e)
if(Session["sUserID"]==null)
Response.Write("isnull");
Response.Write("notnull");
为了测试以上程序,我将WEB.Config的内容更改,将SESSION设置段,改成一分钟后失效WEB.Config文件的一部分,设置一分钟后失效SESSION的地方,如下:&sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="1"/&
然后我运行代码,我特地在原来的IE上,使用菜单新打开一个IE窗口,为保证他们是检查同一个SESSION,在地址中输入ChkSessionOut.aspx,程序运行后,发现秘密了,一分钟后,我点刷新ChkSessionOut.aspx的页面,居然输出notnull,我想到,对了,我每秒都在向这个页面发请求,所以没失效的原因,然后我将有无刷新技术的页面关闭,过一分钟后,发现输出isnull,说明Session失效了,这个发现好,我吃了一惊!想到VS.NET好好好,它就是一个好工具,哈哈!我的环境IIS5.0,Win2000,VS.Net2003
然后我有设置30秒自动请求,无刷新技术的主页面不关,SESSION不失效,一关闭还是1分种后就失效,考虑到了1分钟/30秒是整数,设置成50秒,无刷新技术的主页面不关,它过1分种,失效了!哈哈,完全明白了!1分钟/50秒非整数,所以失效,啊,是不是BUG,大家给评价评价!
&&&&推荐文章:
【上篇】【下篇】session在浏览器关闭后失效问题
前几天在做一个签到系统时,遇到了喜闻乐见的session问题,项目为Spring+SpringMVC+Mybatis框架,maven管理目录的javaweb端系统,对于session的一些问题,作出以下分析,在这里,着重讨论session生命周期的问题,至于其他定义,不做解释:
首先,说明一下session的生命周期:
存储:Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。在一个javaweb应用中,可调用request.getSession(boolean xxx)生成Session。注意,boolean型参数为true时,在此处强制生成一个新的session。
session失效时间:
距离上一次使用该session的时间达到设置的失效时间,session失效
还有一种是方法 session.invalidate()被执行,主动使得session失效
对于失效时间,可以通过配置web.xml中的属性来定义:
&失效时间&
失效时间单位为分钟,若要使session有效时间为一天,则可以设为60*24,当设置为0或负数时,session永久有效,根据失效时间的定义,很容易理解这一情况。
session为什么在浏览器关闭之后失效了?
未设置session失效时间,默认为浏览器关闭后失效;
大部分的session机制都是采用进程中的cookie来保存sessionid的,也就是JSESSIONID,浏览器关闭后进程消失,进程中的cookie消失,那么sessionid也就跟着消失了。
根据已知的内容,写了一个简单的例子:
@Controller
public class SessionTest {
@RequestMapping("/sessionTest")
public String sessionTest(HttpServletRequest request, HttpServletResponse response){
System.out.println("success!")
HttpSession session = request.getSession()
session.setMaxInactiveInterval(259200)
request.setAttribute("creationtime",session.getCreationTime())
request.setAttribute("id",session.getId())
request.setAttribute("max",session.getMaxInactiveInterval(-1))
//在这里,MaxInactiveInterval的优先级高于web.xml中的session-cofig,单位为秒
request.setAttribute("lasttime",session.getLastAccessedTime())
request.setAttribute("sessionTest",session)
System.out.println(session.getCreationTime())
System.out.println(session.getMaxInactiveInterval())
System.out.println(session.getLastAccessedTime())
return "page/showSession"
border="1" cellspacing="0" cellpadding="0"&
&&创建时间:&&${creationtime}&&
&&id:&&${id}&&
&&最大存活时间:&&${max}&&
&&上次使用时间:&&${lasttime}&&
&&session:&&${sessionTest}&&
上面的代码模拟了一次登录情况,控制器中,创建了一个HttpSession对象,基本设置了所有能设置的参数,
但是在浏览器关闭后,再次进入主页面时,还是需要再次登录,说明浏览器端是没有再次拿到这个session对象的,我们可以在chrome浏览器的设置-&显示高级设置-&隐私设置的内容设置-&所有cookie与网站数据中,搜索本地tomcat服务器去查看本次存入的session,即一个名为JSESSIONID的cookie,情况如下
可见,session的失效时间其实还是在浏览器关闭时,所以只有浏览器不关闭再次访问的情况,才能继续使用登录状态,到底上面我们所设置的失效时间代表的是什么?
浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了,我的理解是,失效时间只生效在一次会话过程中,若浏览器关闭,会话结束,其实失效时间设置为永久有效,就是到浏览器关闭,会话关闭的那个时刻。要解决这个问题,可以把cookie与session混用,有这么的笨办法:
主动添加Cookie,设置保存目录与存活时间
public static void addCookie(String name, String value, int age, HttpServletResponse response) throws
UnsupportedEncodingException {
Cookie c = new Cookie(name, URLEncoder.encode(value, "utf-8"));
c.setMaxAge(age);
c.setPath(path);
response.addCookie(c);
在再次访问时,使用Cookie[] cookies = request.getCookies();遍历cookie,根据cookie的名字获取想要的cookie,也可说是session,最后,得到了自己想要的结果,session(这个名为JSESSIONID的cookie)逃出了浏览器的监禁。
确实,对于浏览器内部的session选择实现,我还没有理解透彻,希望大牛能够帮助我。
本文已收录于以下专栏:
相关文章推荐
今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了?我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保存当前用户的状态信息,初...
1、在配置中配置对应的拦截器,下面是我的拦截器配置
Java工程师的最佳学习路线!
JAVA老司机直播啦:通过对架构模式和学习主线的高度总结,可让你快速掌握Java学习的最佳路线,从而达到事半功倍的效果!戳我立即掌握!
通常情况下,当我们关闭浏览器再重新打开后,我们就需要再次进行登陆(如果没有进行下次自动登录之类的设置)。在Jav中(Session是通用的,这里以Java为例)有一种叫做Session机制(会话机制)...
一、首先在web.xml里配置如下信息:(数字10代表10分钟)
二、做一个过滤器,实现Filter接口,对指定路径下的请求进行session的失效...
原文:/jarl/p/5892996.html
HttpSession session = request.getSession();
 ses...
在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。清除session对象...
今天在用TRS后台编辑了一个HTML模版保存并发布之后,预览修改之后的页面就报错了。但是我仅仅加入了下面红色的代码
于是我将上面的的代码去掉又正常了,那问题就出现在我添加的代码中...
1. 单独html标签时,单引号和双引号区别:
输出完全一样,故在纯html标签下以上三种写法是完全等效的。
2. 在JS混编情况下html标签...
Yo Guys!老狗我又來了!今天想給大家介紹的是一位浪漫的詩人——TCP。說他是一位浪漫的詩人,並不是沒有道理的。徐志摩的《再別康橋》中寫到:“我輕輕的走了,正如我輕輕的來,我輕輕的揮手,作別西天的...
epoll_wait(2)SYNOPSIS#include
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, i...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)(一窗昏晓_送流年)
(追梦人物)
(抓狂的蜗牛)
第三方登录:程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。由此我们可以得出如下结论:关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
阅读(...) 评论()用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。 - 突袭新闻
当前位置&:&&&&用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。
热门标签:
用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。
来源:本网整理
编辑:李秀媚评论:
很多朋友碰到怎样的问题:用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。,本网通过互联网收集了以下的答案,以方便用户参考解决问题,具体问题如下:shiro的部分配置如下:&beanid=&securityManager&class=&org.apache.shiro.web.mgt.DefaultWebS...
很多朋友碰到怎样的问题:用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。,本网通过互联网收集了以下的答案,以方便用户参考解决问题,具体问题如下:shiro的部分配置如下:&beanid=&securityManager&class=&org.apache.shiro.web.mgt.DefaultWebS...。很多朋友碰到怎样的问题:用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。,本网通过互联网收集了以下的答案,以方便用户参考解决问题,具体问题如下:shiro 的部分配置如下:
&bean id=&securityManager& class=&org.apache.shiro.web.mgt.DefaultWebSecurityManager&&
&property name=&sessionMode& value=&native&/&
&property name=&cacheManager& ref=&cacheManager&/&
&property name=&sessionManager& ref=&sessionManager&/&
&property name=&realm& ref=&shiroDbRealm&/&
&bean id=&cacheManager& class=&org.apache.shiro.cache.ehcache.EhCacheManager&/&
&bean id=&sessionValidationScheduler& class=&org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler&&
&property name=&interval& value=&1800000&/&
&bean id=&sessionManager& class=&org.apache.shiro.web.session.mgt.DefaultWebSessionManager&&
&property name=&sessionDAO& ref=&sessionDAO&/&
&property name=&globalSessionTimeout& value=&3600000&/&
&property name=&sessionValidationScheduler& ref=&sessionValidationScheduler&/&
&property name=&sessionValidationSchedulerEnabled& value=&true&/&
&bean id=&shiroFilter& class=&org.apache.shiro.spring.web.ShiroFilterFactoryBean&&
&property name=&securityManager& ref=&securityManager&/&
&property name=&loginUrl& value=&/login&/&
&property name=&successUrl& value=&/system&/&
&property name=&unauthorizedUrl& value=&/login?unauthorized&/&
&property name=&filterChainDefinitions&&
/login = authc
用户登录后没有安全退出就直接关闭浏览器后,有两种可能:
1) 用户就是想退出,且没有在会话超时时间内再次登录。缓存中孤立会话在超时后,被一个定时任务清理掉。
2) 用户误关闭了浏览器。这种情况下,用户会再次登录。此时因为上次的会话还存在,所以不会去执行FormAuthenticationFilter,也就不会跳转到successUrl,而是会执行登录页面中form的post action。
我就想到了两种解决方法:
1) 显示登录页面的 get /login 方法里,判断会话,有就安全退出
@RequestMapping(value = &/login&, method = RequestMethod.GET)
public String loginInit() {
if (SecurityUtils.getSubject().getSession() != null) {
SecurityUtils.getSubject().logout();
return &login&;
2) 写在post /login 里。
不知道各位有没有更好的方法?用户提供的答案1:你的问题没有彻底理解清楚,第一浏览器与Session之间的关系没有理顺,所以你的方案没法彻底解决。给你分析一下
服务器Session与浏览器如何关联,浏览器打开时会请求服务器(当然不绝对会产生Session,请求html文件时可能不产生),浏览器会在cookie中存下来,每次请求服务器时会提交给服务器,这样服务求在根据cookie中的sessionId找到对应的Session。浏览器一旦关闭cookie会清除,在次打开没法找到原来的cookie,关联不起来咯。当然关闭浏览器tab标签没关系,只要浏览器没有关闭cookie就不会清除
而你的问题是用户没有点击退出Ehcache中没有清除,所以你写一个sessionFilter,获取session失效事件清除Ehcahe中的数据就可以了,至于想关闭浏览器在打开不需要登录那这能告诉你不太现实,实现起来需要哦在客户端处理不安全。用户提供的答案2:谢谢你的回答。
服务器Session与浏览器如何关联,浏览器打开时会请求服务器(当然不绝对会产生Session,请求html文件时可能不产生),浏览器会在cookie中存下来,每次请求服务器时会提交给服务器,这样服务求在根据cookie中的sessionId找到对应的Session。浏览器一旦关闭cookie会清除,在次打开没法找到原来的cookie,关联不起来咯。当然关闭浏览器tab标签没关系,只要浏览器没有关闭cookie就不会清除
你说的没错。但是在我的shiro环境中,只要不是安全退出且会话没有过期,每次打开IE9,'JSESSIONID' cookie 的值都是同一个,所以会在Ehcache中找到缓存的会话。
另外,Chrome的话只要关闭就会清除'JSESSIONID' cookie。
而你的问题是用户没有点击退出Ehcache中没有清除,所以你写一个sessionFilter,获取session失效事件清除Ehcahe中的数据就可以了,至于想关闭浏览器在打开不需要登录那这能告诉你不太现实,实现起来需要哦在客户端处理不安全。
配置sessionValidationScheduler就是为了在会话超时后,自动清理缓存。用户提供的答案3:
我也遇到相同问题,求解决,登陆以后 要是我没有安全退出直接关闭浏览器, 由于认证&currentUser.isAuthenticated()是True,所以直接拷贝之前访问的页面仍然能够访问,而且我还遇到一个问题,当我访问首页的时候ip后面会有jsessionid
http://localhost:8080/drug/login.JSESSIONID=60d0c2b7-19c7--034fd68100ef,然后重启服务器就会出现异常
org.apache.shiro.session.UnknownSessionException: There is no session with id [53e-4aee-b369-54e849c49ff3]
at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170)
at org.apache.shiro.session.mgt.eis.CachingSessionDAO.readSession(CachingSessionDAO.java:261)
at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236)
at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222)
at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118)
at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:105)
at org.apache.shiro.session.mgt.AbstractNativeSessionManager.getSession(AbstractNativeSessionManager.java:97)
at org.apache.shiro.mgt.SessionsSecurityManager.getSession(SessionsSecurityManager.java:125)
at org.apache.shiro.mgt.DefaultSecurityManager.resolveContextSession(DefaultSecurityManager.java:456)
at org.apache.shiro.mgt.DefaultSecurityManager.resolveSession(DefaultSecurityManager.java:442)
at org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:338)
at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846)
at org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148)
at org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
at java.lang.Thread.run(Thread.java:662)
虽然对程序没什么影响,请高手解答!
用户提供的答案4:能不能把cache保存在session里面啊用户提供的答案5: 关闭浏览器,再打开后,虽然授权缓存了,但是认证是必须的,在认证成功后,清除之前的缓存,这样也是有效的,可以试试。
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
AuthenticationInfo info = super.doGetAuthenticationInfo(token);
clearCache(info.getPrincipals());
用户提供的答案6:朋友你可以把你的代码发给我嘛,我是初学者,用户提供的答案7:引用来自“纯天然原味酱”的答案谢谢你的回答。
服务器Session与浏览器如何关联,浏览器打开时会请求服务器(当然不绝对会产生Session,请求html文件时可能不产生),浏览器会在cookie中存下来,每次请求服务器时会提交给服务器,这样服务求在根据cookie中的sessionId找到对应的Session。浏览器一旦关闭cookie会清除,在次打开没法找到原来的cookie,关联不起来咯。当然关闭浏览器tab标签没关系,只要浏览器没有关闭cookie就不会清除
你说的没错。但是在我的shiro环境中,只要不是安全退出且会话没有过期,每次打开IE9,'JSESSIONID' cookie 的值都是同一个,所以会在Ehcache中找到缓存的会话。
另外,Chrome的话只要关闭就会清除'JSESSIONID' cookie。
而你的问题是用户没有点击退出Ehcache中没有清除,所以你写一个sessionFilter,获取session失效事件清除Ehcahe中的数据就可以了,至于想关闭浏览器在打开不需要登录那这能告诉你不太现实,实现起来需要哦在客户端处理不安全。
配置sessionValidationScheduler就是为了在会话超时后,自动清理缓存。用户提供的答案8:遇到同样的问题,请问怎么解决的。用户提供的答案9:设置缓存有效期就行了,若想关闭浏览器就清空 SESSION 得写个基于网页的容器控件之类的,用来监控页面状态。
用户提供的答案10:sessionValidationScheduler.sessionManager
$sessionManager相关阅读:
【氪TV视频】把链条都藏了起来,这款JIVR Bike折叠电动车还真是拼
吃的改变 | 每个人都可以“发现”自己的lifestyle,这是新版城觅想做的
想让内容可售卖的“玩途”,开始进一步做出境后的目的地即时预订服务了
本网最新文章}

我要回帖

更多关于 猎豹浏览器收藏夹消失 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信