用户二次登陆,干掉第一次登录的session
2013-09-27 17:58
176 查看
目前遇到这样的问题:
用户登录之后,不允许同时登录多个用户(这个已经实现)。但是如果用户以外关闭了浏览器之后,要等到session超时才能 再一次登录,真是太悲剧了。
so。。。现在的解决方案便是,允许第二次登录,登录之后要将第一次登录的session销毁
借助weblogic.jar 反射获取servletContext 中的sessionContext,然后将其opensession属性中的sessionId 删除即可达到目的,代码如下:(我们的项目是将用户第一次登录的session存放到了缓存中去,在用户第二次进来的时候会先获取上一次的session,存在的话就将其从servletContext中删掉)
ServletContext scope = (ServletContext)request.getSession().getServletContext();
Class clazz = weblogic.servlet.internal.WebAppServletContext.class;
Field f = clazz.getDeclaredField("sessionContext");
f.setAccessible(true);
//--取得session context
weblogic.servlet.internal.session.SessionContext sc = (weblogic.servlet.internal.session.SessionContext)f.get(scope);
clazz = weblogic.servlet.internal.session.SessionContext.class;
f = clazz.getDeclaredField("openSessions");
f.setAccessible(true);
//--拿到终的sessionMap
Hashtable sessionMap = (Hashtable)f.get(sc);
//第一种直接删除该sessionID
System.out.println("要删除的sessiongid "+loginSession.getId()+"==========================");
System.out.println("sessionMap 中是否含有将要删除的id"+ sessionMap.containsKey(loginSession.getId().split("!")[0])+"================");
sessionMap.remove(loginSession.getId().split("!")[0]);
效果:
打开一个浏览器登录xxx用户
再打开一个浏览器登录xxx用户
然后再在第一个浏览器中点击任意链接会跳转到登录页面。
---------------------------新增问题
以上逻辑适用于同一台服务器或着同一台服务器上的集群 均可以实现。
但是:
我们的系统由于用了webloic部署了集群(集群在多台服务器上)之后,上面的逻辑便不适用了,所以给出以下解决方案。
因为集群是weblogic 做的,对于session的保持,销毁都可以从weblogic获知。
目前做出的方案是: 登录的时候在membercache保存当前sessionid ,通过拦截器对比membercache中的值跟当前session的值,如果不一样,利用ServletAuthentication.invalidateAll(request) 销毁session即可
用户登录之后,不允许同时登录多个用户(这个已经实现)。但是如果用户以外关闭了浏览器之后,要等到session超时才能 再一次登录,真是太悲剧了。
so。。。现在的解决方案便是,允许第二次登录,登录之后要将第一次登录的session销毁
借助weblogic.jar 反射获取servletContext 中的sessionContext,然后将其opensession属性中的sessionId 删除即可达到目的,代码如下:(我们的项目是将用户第一次登录的session存放到了缓存中去,在用户第二次进来的时候会先获取上一次的session,存在的话就将其从servletContext中删掉)
ServletContext scope = (ServletContext)request.getSession().getServletContext();
Class clazz = weblogic.servlet.internal.WebAppServletContext.class;
Field f = clazz.getDeclaredField("sessionContext");
f.setAccessible(true);
//--取得session context
weblogic.servlet.internal.session.SessionContext sc = (weblogic.servlet.internal.session.SessionContext)f.get(scope);
clazz = weblogic.servlet.internal.session.SessionContext.class;
f = clazz.getDeclaredField("openSessions");
f.setAccessible(true);
//--拿到终的sessionMap
Hashtable sessionMap = (Hashtable)f.get(sc);
//第一种直接删除该sessionID
System.out.println("要删除的sessiongid "+loginSession.getId()+"==========================");
System.out.println("sessionMap 中是否含有将要删除的id"+ sessionMap.containsKey(loginSession.getId().split("!")[0])+"================");
sessionMap.remove(loginSession.getId().split("!")[0]);
效果:
打开一个浏览器登录xxx用户
再打开一个浏览器登录xxx用户
然后再在第一个浏览器中点击任意链接会跳转到登录页面。
---------------------------新增问题
以上逻辑适用于同一台服务器或着同一台服务器上的集群 均可以实现。
但是:
我们的系统由于用了webloic部署了集群(集群在多台服务器上)之后,上面的逻辑便不适用了,所以给出以下解决方案。
因为集群是weblogic 做的,对于session的保持,销毁都可以从weblogic获知。
目前做出的方案是: 登录的时候在membercache保存当前sessionid ,通过拦截器对比membercache中的值跟当前session的值,如果不一样,利用ServletAuthentication.invalidateAll(request) 销毁session即可
相关文章推荐
- 实现session登陆时间的验证,验证用户登录页面的一个监听器
- session 用户是否第一次登录及处理.txt
- 实现session登陆时间的验证,验证用户登录页面的一个监听器
- servlet学习笔记3——用户登录网站(通过session验证登陆用户)
- 公司局域网内访问其他电脑,为了方便,第一次登录时用户名和密码选择了记住,现在想更换用户登陆
- servlet学习笔记3——用户登录网站(通过session验证登陆用户)
- 在ASP.NET中怎么用SESSION判断用户是否登录? 以及Session登陆后丢失的解决办法
- jsp利用session记录登陆状态,保证用户的使用连贯性,并且防止未登录用户绕过登陆页
- 用session判断此用户是否第一次登陆
- PHP会话(Session)实现用户登陆功能
- Facebook 自定义登录按钮,登陆完毕后清除缓存的Session信息
- AD技巧之指定用户登录和指定计算机登陆 推荐
- 登录时第一次输入验证码显示验证码错误。出现的问题:验证码ajax验证时 后台取不到session的值
- java中判断用户是否为第一次登陆(在页面上进行控制)
- 增加远程登录用户登陆个数
- 利用Session完成用户的登录和注销
- 用户登录(登陆失败3次,2分钟后再登陆)
- 在ASP.NET中用SESSION判断用户是否登录
- 登录判断 之 asp.net 使用继承类的Session,判断用户是否登录
- php同时使用session和cookie来保存用户登录信息