单点登陆,实现方法很多
可以这样application.getAttribute("username")
登陆的时候判断是否这个用户名已经登陆
如果是第一个登陆的就application.setAttribute("username","login");

解决方案 »

  1.   

    我是初学:这个登陆的代码:
    loginto.jsp:
    <%
    //获得请求的参数。
    String id=request.getParameter("id");
    String psw=request.getParameter("password");
    //连接数据库
    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    Connection con=java.sql.DriverManager.getConnection("jdbc:mysql://127.0.0.1/gold?useUnicode=true&characterEncoding=GB2312","root","123456");
    Statement statement=con.createStatement();ResultSet result=statement.executeQuery("select *from id where userId='"+id+"' and password='"+psw+"'");session.setAttribute("isLog",new String("0"));if(result.next())
    {
    session.setAttribute("isLog",new String("1"));
    response.sendRedirect("denglu.jsp");
    result.close();
    statement.close();
    con.close();
    }
    else
    {
    //session.setAttribute("isLog",new String("0"));
    response.sendRedirect("error.html");//账号或密码错误,转入错误页面
    result.close();
    statement.close();
    con.close();
    }
    %>楼上的高手我要修改的是  session.setAttribute("isLog",new String("0"));这里吗?
    修改成:application.setAttribute("id","login");吗?
      

  2.   

    jFresH_MaN(The answer is ......)的想法不错,还简单
      

  3.   

    楼上的高手我要修改的是  session.setAttribute("isLog",new String("0"));这里吗?
    修改成:application.setAttribute("id","login");吗?
    --------------------------------------------------------------------------------
    session也是可以的,成功登陆,isLog为1。当其他用户也登陆这个ID时,就可以判断isLog
    为1时,就不允许他登陆
      

  4.   

    jFresH_MaN(The answer is ......),依照你的方法,如果用户非正常退出呢?比如直接关闭浏览器
      

  5.   

    jFresH_MaN的思想不错,具体的还要自己做.
    开始不要这么多了
      

  6.   

    发现对于登录问题的解决都说用session监听,但是没有人写出示例代码,今天写了一个,希望对大家有所帮助.
    解决同名用户登录的问题,类似QQ,即同名用户第二次登录,第一次登录的用户就掉线.
    SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)
    package com.test;
    import javax.servlet.http.*;
    import java.util.*;public class SessionListener implements HttpSessionListener{
        private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
        /**以下是实现HttpSessionListener中的方法**/
        public void sessionCreated(HttpSessionEvent se){
        }
        
        public void sessionDestroyed(HttpSessionEvent se){
            hUserName.remove( se.getSession().getId() );
        }
        /*
         * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
         * @param sUserName String-登录的用户名称
         * @return boolean-该用户是否已经登录过的标志
         */
        public static boolean isAlreadyEnter(HttpSession session,String sUserName){
            boolean flag = false;
            if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
                flag = true;
                //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
                Iterator iter = hUserName.entrySet().iterator();
                while (iter.hasNext()) {
                    Map.Entry entry = (Map.Entry)iter.next();
                    Object key = entry.getKey();
                    Object val = entry.getValue();
                    if( ( (String)val ).equals(sUserName) ){
                        hUserName.remove(key);
                    }
                }
                hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
                System.out.println("hUserName = " + hUserName);
            }
            else{//如果该用户没登录过,直接添加现在的sessionID和username
                flag = false;
                hUserName.put( session.getId(),sUserName );
                System.out.println("hUserName = " + hUserName);
            }
            return flag;
        }
        /*
         * isOnline-用于判断用户是否在线
         * @param session HttpSession-登录的用户名称
         * @return boolean-该用户是否在线的标志
         */
        public static boolean isOnline(HttpSession session){
            boolean flag = true;
            if( hUserName.containsKey( session.getId() ) ){
                flag = true;
            }
            else{
                flag = false;
            }
            return flag;
        }
    }web.xml部署于/App/WEB-INF下
    <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"><web-app> <listener>
    <listener-class>
    com.inspirer.dbmp.SessionListener
    </listener-class>
    </listener></web-app>
    应用部分
    1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")
    既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线
    2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.写的应该比较详细了,希望对大家有所帮助.希望大家能提提修改的意见,认为可以的朋友帮忙UP一个!!
    最后祝大家春节快乐,合家团圆
      

  7.   

    如果要管理费正常退出,可以用一个全局bean进行轮询,在设定的时间内如果没有获得用户的请求,就自动退出
      

  8.   

    楼上的haohaohaohao1 哈哈,在这又见到你了!
    我也血洗一下,顶!!!!
      

  9.   

    我想把Bean做成单例模式不就可以了?
      

  10.   

    这里的讨论很热烈,不过首先得澄清,这个问题不叫单点登陆,呵呵,单点登陆指的是sso,感兴趣的朋友可以看看josso。tly同学的回复只能说找到问题的一种解决办法,但实现的代码是有问题的:
    1。多线程安全;
    2。sessionCreated访法没有做任何实现的工作。