日期:2014-05-17  浏览次数:20806 次

java 如何实现同一账户登录验证
1.项目采用S2SH应用架构,现在实现一个功能是 A 机器 A001账户登录,同理其他机器不能使用A001重复登录。
2.考虑到浏览器异常,如果A机器浏览器出现异常,重启,进程等方式结束,此时其他机器可以使用A001登录一次。
 等待大牛提点好意见,最好别用第三方插件,自己实现。

------解决方案--------------------
你用spring security 实现
------解决方案--------------------
1,在user表的加个是否在线的字段,例如A001登录了,则标志已在线,下线改为离线,
别人登录的时候先check该字段,已在线则不能登录。
2,就比较麻烦了,只能当user在相当长时间内没有操作,按离线处理。。。

期待其他大牛完美解决方案。。。
------解决方案--------------------
实现起来比较麻烦,你还是看看具体的
spring security 方面的知识
下边是配置文件中的一小部分
<!-- 防止一个用户重复登录好几次-第二次登录会让第一次登录失效 -->
<security:session-management>
<security:concurrency-control max-sessions="1" expired-url="/doubleErr.jsp" />
</security:session-management>
------解决方案--------------------
探讨

1,在user表的加个是否在线的字段,例如A001登录了,则标志已在线,下线改为离线,
别人登录的时候先check该字段,已在线则不能登录。
2,就比较麻烦了,只能当user在相当长时间内没有操作,按离线处理。。。

期待其他大牛完美解决方案。。。

------解决方案--------------------
你的意思就是除非你出错,否则别人挤不下去你。
这个貌似没听说过呀 呵呵
我说的这个和qq一样的,别人会把你挤下去,只要知道你的密码和用户名
------解决方案--------------------
探讨

1,在user表的加个是否在线的字段,例如A001登录了,则标志已在线,下线改为离线,
别人登录的时候先check该字段,已在线则不能登录。
2,就比较麻烦了,只能当user在相当长时间内没有操作,按离线处理。。。

期待其他大牛完美解决方案。。。

------解决方案--------------------
这个只需要session和application就好了,
用户登录时,这样写:

User user = dao.login(userName, password);// 数据库中判断用户名和密码
if (null != user) {// 表示用户存在
session.setAttribute("user", user);// 把用户放进session中
application.setAttribute(userName, session.getId());/* 把用户所在的sessionId放进application中,首先要明白一点,一个session对应一个浏览器,其次要注意一点,userName必须是唯一的*/
}



当用户访问到其他url的时候,可以在过滤器或你的拦截器中这样写:

User user = (User) session.getAttribute("user");// 从session中取出用户
if (null == user) {// 未登录或者登录已经过期
response.sendRedirect(request.getContextPath());// 跳转到首页或登录页面
}
String sessionId = (String) application.getAttribute(user.getUserName());
if (null == sessionId || !sessionId.equals(session.getId())) {/*这说明用户已经在其他电脑或其它浏览器登录了,那么之前登录的session就无效了,自动被后面的登录给踢掉*/ 
response.sendRedirect(request.getContextPath());// 跳转到首页或登录页面
}
chain.doFilter(request, response);// 通过验证,放行用户进入目标url


这种方式是我的一个前辈想到的,我们公司的所有项目都采纳了这种方式,
确保一个账号只能在一个浏览器中使用
------解决方案--------------------
测试一下
------解决方案--------------------
(1)
<meta http-equiv="refresh" content="5" />
自动去刷,建立COOKIES 和SESSION.
SESSION:放IP地址或者MAC地址
COOKIES:放更新时间
(当然这里面也可以用数据库代替,MAC,IP,登录时间,刷新时间等存数据库)
剩下写逻辑判断好了。

(2)
话说A001登录一次,让他线登录等待被(写一个定时器)说明是XXX已经登录你需要等XXX时间,如果XXX不下你不能进入,直到计时器到了,检测下,多简单。AJAX每1分钟丢一个请求表示在线。
------解决方案--------------------
探讨

(1)
<meta http-equiv="refresh" content="5" />
自动去刷,建立COOKIES 和SESSION.
SESSION:放IP地址或者MAC地址
COOKIES:放更新时间
(当然这里面也可以用数据库代替,MAC,IP,登录时间,刷新时间等存数据库)
剩下写逻辑判断好了。

(2)
话说A001登录一次,让他线登录等待被(写一个定时器)说明……

------解决方案--------------------
个人感觉在数据库表中加个表示状态的字段,第二个人登陆是,查询表中字段,如果有人在用给出当前有用户登陆,如果没有则让第二个人登陆成功,这样比较简单吧
------解决方案--------------------