求泰妍新冬专泰妍i百度云资源源

解决因为关闭浏览器造成session失效的假象-爱编程
解决因为关闭浏览器造成session失效的假象
&session在服务端保存信息,是否关闭浏览器和session销毁无关,即:即使关闭浏览器,session还是存在的。但是为什么关闭浏览器后session好像就消失了。
1 session和cookie的关系
session在服务端保存信息,cookie在客户端保存信息。
实际上有三种方式能可以让 Session 正常工作:
& · 基于 URL Path Parameter,默认支持。
&· 基于 Cookie,如果没有修改 Context 容器的 cookies 标识,默认也是支持的。
&· 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持。
这里我们讲一下session基于cookie的工作模式。
服务端产生session后,会把session的id传回客户端,这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NANE 为 JSESIONID 的一个 Cookie,value为session的id。
& & &session在服务端保存信息,是否关闭浏览器和session销毁无关,即:即使关闭浏览器,session还是存在的。但是为什么关闭浏览器后,好像session就不存在了。&这就是上文提到的,sessionID是通过cookie存再客户端的,并且存储的这个cookie的key为“JSESIONID”,value为sessionID的值。但是cookie的key(JSESIONID)的生存周期一般是浏览器关闭后消失,浏览器关闭后,JSESIONID消失。正常流程是前端请求服务端时会把cookie带过去,但是现在,因为浏览器关闭,JSESIONID为null。服务端再想通过JSESIONID获取session,就无法获取,这也是为什么关闭浏览器后,好像session就过期了。
解决办法:修改浏览器关闭后JSESIONID消失的默认设置,手动设置JSESSION的过期时间。
HttpSession session = request.getSession();
&session.setAttribute(“aa”, “bb”);&
session.setMaxInactiveInterval(2 * 60); // Session保存两分钟
Cookie cookie = new Cookie("JSESSIONID", session.getId());
&cookie.setMaxAge(2 * 60); // 客户端的JSESSIONID保存两分钟
cookie.setPath("/");
&response.addCookie(cookie);
这样即使浏览器关闭,服务端仍然可以通过request.getSession().getAttribute("aa")获取值。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。所有回答(3)
浏览器关闭,Session就自动注销了的。
园豆:24381
园豆:1204
不知道你问的是哪种开发语言的,
如果是.net的话,session在用户中断访问后,默认有20分钟的缓存期,超过20分钟就自动销毁。
或者在global.asax文件里找到Session_End的方法,可以在里面立即注销。
最近也遇到这个问题了,上级的要求是要使用code注销。但是感觉没必要。
session都有生命期。过了期限自动销毁。(你可以设置期限)
你这个问题,浏览器关闭了,这是用户的正常行为。
不正常的行为是浏览器没有关闭,网页还开着。这就麻烦了。
我的解决方法是:监测用户的鼠标行为,长时间无行动的话,页面将跳转到登录。
有什么好的方法,可以交流一下。
园豆:1187
园豆:1187
园豆:1187
园豆:1187
园豆:1187
园豆:33397
&&&您需要以后才能回答,未注册用户请先。如何忽略那个不在线但session还未销毁的用户?
问题的根源在于关闭浏览器后某用户的session不会立即销毁。如何忽略那个不在线但session还未销毁的用户?做到该用户既不计数,也不输出用户信息
不是30min后销毁?
尴尬,是我弄错了,关闭浏览器只是客户端丢失sessionid....
写下你的评论...
写下你的评论...
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2用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,这是新版城觅想做的
想让内容可售卖的“玩途”,开始进一步做出境后的目的地即时预订服务了
本网最新文章你正在使用的浏览器版本过低,将不能正常浏览和使用知乎。}

我要回帖

更多关于 泰妍i百度云资源 的文章

更多推荐

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

点击添加站长微信