1.SessionListener.java如下:import  javax.servlet.http.*;  
import  java.util.*; 
public  class  SessionListener  implements  HttpSessionListener{
   private  static  java.util.Hashtable  hUserName  =  new   Hashtable();
   public  void  sessionCreated(HttpSessionEvent  se){
         System.out.println( "客户端已连接服务器 --会话号为: " + se);
    }   public  void  sessionDestroyed(HttpSessionEvent  se){
           hUserName.remove(se.getSession());
           System.out.println( "用户会话已失效session -- " + se);
    }   public  synchronized  static  boolean  isLogined(HttpSession  session,String  user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
       boolean  flag  =   false;
       if(hUserName.containsKey(user_id1)){
                             flag  =   true;
                             HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
                             try   {
                                 vsession.invalidate();//踢掉先登陆者
                                 System.out.println("用户 - " + user_name + " || 已存在 - " +session);
                                 System.out.println("用户 - " + user_name + " || 被挤掉了");
                             }
                             catch  (Exception   ex){}
                     }
       else{
               flag  =   false;
               
       }
       hUserName.remove(user_id1);
       if(flag==false){//如果没有登陆则在哈西表中记录
       hUserName.put(user_id1,session);
       System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
       }
       return   flag;
    }   public  synchronized static boolean deleteUserName(HttpSession  session,String user_id1)
    {
   Date date=new Date();
   HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
    System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
    hUserName.remove(user_id1); //删除用户Action调用
    vsession.invalidate();//
    return true;
    }
   
   public  synchronized static void Isconnent(HttpSession  session,String user_id1,String user_name)
   {
Date date=new Date();
   System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
   hUserName.remove(user_id1); //删除用户Action调用
   
   }
   
   
   public  synchronized  static  boolean  isOnline(HttpSession  session,String user_id1){//登陆后使用判断是否已经登陆Action调用
           boolean  flag  =   false;
          // System.out.println("======isOnline=======");
            HttpSession   vsession =null;
            try{
               vsession  =  (HttpSession)  hUserName.get(user_id1);
            }catch(Exception e){
             flag = true;
             System.out.println(user_id1+"验证登陆异常");  flag = false;
            }
               if(vsession != null){
                if  (session.getId().equals(vsession.getId()))  {
                    flag  =   true;
                    System.out.println(user_id1+"通过验证");     
                }  else   {
                    flag  =   false;
                }
    }
               return   flag;    }
}2.
Action中修改如下:
public String adminLogin() throws Exception { listUser = adm.findByAdmin(getUsername(), getPassword());
Iterator<UserInfo> iter = listUser.iterator();
HttpSession session = ServletActionContext.getRequest().getSession();
String username = "";
String userid = "";
if (listUser.size() != 0) {
Map session1 = ActionContext.getContext().getSession();
session1.put("user", getUsername());
/**
 * 上面两句不加,获取不到session
 * 
 * */
while (iter.hasNext()) {
UserInfo userInfo = iter.next();
session.setAttribute("username", userInfo.getUsername()
.toString().trim());
session.setAttribute("userid", userInfo.getUserid().toString()
.trim());
username = userInfo.getUsername().toString().trim();
userid = userInfo.getUserid();
}
boolean flag = SessionListener.isLogined(session, userid, username);
if (flag == true) {
return "isloged";
}
return "adminLogin";
} else {
addFieldError("username", "用户名或密码不正确或不存在");
return INPUT;
}
}3.web.xml文件:
 <listener> 
        <listener-class>com.yaxing.utils.SessionListener</listener-class> 
    </listener>
第一次登录,一切正常
后台打印信息:
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户已经登陆: - admin || 会话号为: - org.apache.catalina.session.StandardSessionFacade@1827d1
登录成功!!
。当第二次登录再开一个窗口(360浏览器,IE7)的时候后台错误:
2011-8-21 18:40:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户会话已失效session -- javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
用户 - admin || 已存在 - org.apache.catalina.session.StandardSessionFacade@1827d1
用户 - admin || 被挤掉了
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@b11164]
前台显示:500错误HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
--------------------------------------------------------------------------------

解决方案 »

  1.   

    在你的struts配置文件对应的action中加上 scope="prototype" 作用域的问题
      

  2.   

    不好意思,项目中使用的是Struts2+Hibernate3呢
    没有使用Spring呢。另外,页面出错后,刷新下,竟然可以登录了。
    但是那个检测重复登录的没有起作用呢。谢谢了。
      

  3.   

    试试private  static  java.util.Hashtable  hUserName  = null;public static Map getCache() {
       if(hUserName == null) {
         hUserName  =  new Hashtable();
       }   return hUserName;
    }
      

  4.   

    加入代码后,出现 调试到 public  synchronized  static  boolean  isLogined(HttpSession  session,String  user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
           boolean  flag  =   false;
           System.out.println(hUserName.containsKey(user_id1));
           if(hUserName.containsKey(user_id1)){
                                 flag  =   true;
                                 HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
                                 try   {
                                     vsession.invalidate();//踢掉先登陆者
                                     System.out.println("用户 - " + user_name + " || 已存在 - " +session);
                                     System.out.println("用户 - " + user_name + " || 被挤掉了");
                                 }
                                 catch  (Exception   ex){}
                         }
           else{
                   flag  =   false;
                   
           }
    到 if(hUserName.containsKey(user_id1)){这就报错了,java.lang.NullPointerException
    com.yaxing.utils.SessionListener.isLogined(SessionListener.java:28)
    com.yaxing.admin.action.LoginAction.adminLogin(LoginAction.java:114)
    后台没有错误。谢谢。怎么回事呢~