如何用Java实现用户在另一地方登录,而这里自动退出 我想实现一个功能,就是我的页面登录后,如果用户在另一个地方登录了,在这边会提示说“用户已经在别的地方登录”,然后在边被强制退出,请问该怎么实现(我是用JSP的)?就类似QQ,你的用户在别的地方登录,你就会下线,应该怎么做呢?最好是能给个例子让我看一下,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以用session保存用户的Ip 然后每连接一次就判断是不是同一个Ip http是无状态的,推的技术,是无法实现的吧 。页面不挺的刷,用ajax,就行了,不需要进行页面的刷新。 http://www.seomg.cn/article.asp?id=127 写的不是好。。能实现希望对你有帮助 所谓自动退出,是否理解成,他不能进行后续的(服务器端)操作?如果可以,则比较简单。1.1 加张表或字段,标识每个用户最后登录的session id(针对多个应用服务器)1.2 内存中放一个userId-sessionId的map(针对单个服务器)2 加个过滤器,检查登录用户的session id与之是否匹配(为效率见,数据库方式的建议缓存),如不匹配,则执行(服务器端的)logout,例如session.invalidate();这个太杀鸡用牛刀了,为了概率不高的同时登录,而对所有HTTP连接使用这个技术,性价比太低了。Ajax也可以,但是个人感觉也有点浪费了。 登陆的时候直接找个SERVLET验证一下不就好了 就是因为http是无状态的,无需保持连接.一般的做法是一旦其它地方登陆之后,之前登陆的页面再有新请求,则提示需要重新登陆.1楼说的对的.放在Session中,每次请求比下IP. 可以建一个session监听类,把登入人id,或那么 存入session中,把所有的session存入一个集合中public void sessionCreated(HttpSessionEvent e) { // TODO Auto-generated method stub HttpSession session = e.getSession(); System.out.println("session-------->:"+session); ServletContext application =session.getServletContext(); HashSet<HttpSession> sessionSet =(HashSet)application.getAttribute("sessionSet"); if(sessionSet == null){ sessionSet = new HashSet<HttpSession>(); } Iterator it = sessionSet.iterator(); while(it.hasNext()){ HttpSession sess =(HttpSession)it.next(); if(sess.getAttribute("name") == null){ //session过时,就自动删除 sessionSet.remove(sess); } } application.setAttribute("sessionSet", sessionSet); sessionSet.add(session); } public void sessionDestroyed(HttpSessionEvent e) { HttpSession session = e.getSession(); ServletContext application =session.getServletContext(); HashSet<HttpSession> sessionSet =(HashSet)application.getAttribute("sessionSet"); if(sessionSet != null){ sessionSet.remove(session); } }这个HashSet集合存在application中,当用户登入时可以拿出来,判断用户是否已经登入过有个缺点就是,当用户访问量大时,会占用不少内存 直接比session就好了,干嘛要比较IP,如果是内网用户,比IP还有什么意义 tomcat异常,关于AxisHTTPSessionListener 熟悉maven的朋友··· 上百万行的数据查询,高效率? 求助!struts问题 hibernate怎么做级联删除啊? 刚出道,应该选择做那样呢(技术) 求!jsf-spring集成的实例? 面试时问我文件上传流程,我该怎么答?我语言总结能力差,大家帮帮我吧。。 java问题 jboss的jvm bind:8080和Oracle Servlet Engine端口冲突怎么解决? open flash chart2 java 堆积图 如何去掉图形提示或者更改 怎样才能传递 " % "这个特殊字符.
http是无状态的,推的技术,是无法实现的吧 。页面不挺的刷,用ajax,就行了,不需要进行页面的刷新。
1.2 内存中放一个userId-sessionId的map(针对单个服务器)
2 加个过滤器,检查登录用户的session id与之是否匹配(为效率见,数据库方式的建议缓存),如不匹配,则执行(服务器端的)logout,例如session.invalidate();这个太杀鸡用牛刀了,为了概率不高的同时登录,而对所有HTTP连接使用这个技术,性价比太低了。
Ajax也可以,但是个人感觉也有点浪费了。
存入session中,把所有的session存入一个集合中
public void sessionCreated(HttpSessionEvent e) {
// TODO Auto-generated method stub
HttpSession session = e.getSession();
System.out.println("session-------->:"+session);
ServletContext application =session.getServletContext();
HashSet<HttpSession> sessionSet =(HashSet)application.getAttribute("sessionSet");
if(sessionSet == null){
sessionSet = new HashSet<HttpSession>();
}
Iterator it = sessionSet.iterator();
while(it.hasNext()){
HttpSession sess =(HttpSession)it.next();
if(sess.getAttribute("name") == null){ //session过时,就自动删除
sessionSet.remove(sess);
}
}
application.setAttribute("sessionSet", sessionSet);
sessionSet.add(session);
} public void sessionDestroyed(HttpSessionEvent e) {
HttpSession session = e.getSession();
ServletContext application =session.getServletContext();
HashSet<HttpSession> sessionSet =(HashSet)application.getAttribute("sessionSet");
if(sessionSet != null){
sessionSet.remove(session);
}
}
这个HashSet集合存在application中,当用户登入时可以拿出来,判断用户是否已经登入过
有个缺点就是,当用户访问量大时,会占用不少内存
直接比session就好了,干嘛要比较IP,如果是内网用户,比IP还有什么意义