我要做的功能就是跟QQ的功能类似的,不过是基于B/S的,当用户在同一台电脑,同一时段登录,同一用户在同一台电脑或者另外一个地点登录,系统会提示改用户已经登录,如果在同一电脑上直接提示不能重复登录,如果在另一地点登录要把先前的用户挤掉。请问这个功能怎么实现,最好能有源码(servlet或者struts)?
  我查了一些资料,看了跨域的单点登录(SSO),但是很模糊,请给提供一些资源。

解决方案 »

  1.   

    这个不难做,做个静态map 记录一下登录用户的username(key) 、 sessionid(value)、
    每个用户过来之后,如果是新登录,则覆盖map里面的值,否则的话比对一下当前会话的sessionid和map里面的sessionid是否一致,不一致踢出去就可以了(把session销毁)这些判断都是用filter来处理就可以。代码就不给你贴了
      

  2.   

    在1楼说的基础下,你在画面遍历一下不就可以了吗?
    但是你说要跨服务器, 那就要用临时数据库表之类的了.
    还有写一个job, 定时更新当前在线人的状态.
    比如每1分钟查一下表,把超时的查出来,改状态或者删除等操作.
    这样会不会好些?
      

  3.   

    或者你不想用job.也可以用ajax来定时去更新/读取当前在线情况.
    当然你要跨服务器那得用一个数据库会好做一些.
    以上是排除性能上的问题.
      

  4.   

    我们系统的实现方法为:1 登陆时记录此次登录的IP,并且登陆后,用户表状态改为登录。2 如果又收到此用户的登陆请求,判断IP和登录状态,已登录且与上次登录IP相同返回“请不要重复登陆~”
      如IP不同,登录状态为登录,则同1楼。。就不重复了。。
      

  5.   


    因为要求的安全性比较高~(银行系统)所以断电,异常退出后用户还是保留登陆状态。必须由其它用户登陆后,将其用户做“强制签退”,并注明原因。其实我们系统IP和用户是绑定的,除非绑定多个IP,否则用户只能在一台机器上登录。这期间还涉及到一些权限的问题,就不细说了。现在这个项目安全要求比较低,如果异常退出,断电等现象我想可以用session超时,在其它机器上登陆一下~之类的方法解决~我的方案可能并不适用于你的系统。只是给你一种解决方案,供你参考下啦~
      

  6.   

    我做的不行,非正常关闭处理不了(比如关闭进程,session还没失效)
    你能把你的代码贴出来,供我学习一下吗?或者把你QQ给我,向你请教。我的QQ:295833641
      

  7.   

    用户访问量大的话肯定要借助数据库来操作
    记录用户的登录状态和IP地址
    用户登录的时进入数据库校验即可
    断电什么的是可以通过session超时,自动清除数据库的登录状态
    或者仿照银行的cop终端,加入用户复核动作
      

  8.   

    lz采用spring security 框架可以很好解决楼主的这个问题,需要配置如下在web.xml中配置
    <listener>
    <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
    </listener>然后再配置文件配置
    <http auto-config="true" access-denied-page="/accessDenied.jsp">
    <!--即使用户没有登录页可以访问longin.jsp -->
    <intercept-url pattern="/login.jsp" filters="none" />
    <!--自定义登录界面-->
    <form-login login-page="/login.jsp" default-target-url="/index.jsp"
    always-use-default-target="true" authentication-failure-url="/login.jsp?error=true" />
    <logout logout-url="/loginout.jsp"/>
    <concurrent-session-control max-sessions="1"
    exception-if-maximum-exceeded="true" />
    </http>
    可以很好的解决。