session在30分钟失效后执行一个事务该怎么做?

解决方案 »

  1.   

    session.setMaxInactiveInterval(1800)//30分钟
      

  2.   

    session.setMaxInactiveInterval(1800)//30分钟
      

  3.   

    session监听器
    HttpSessionListener 或者HttpSessionBindingListener 
      

  4.   

    能具体一点吗 ? 因为session监听器不会用,怎样实现啊?
      

  5.   

    package Servlet;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    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;
                int i=0;
                //遍历原来的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();
                    i++;
                    if( ( (String)val ).equals(sUserName) ){
                        hUserName.remove(key);
                    }
                }
                session.setAttribute("ii", i);
                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;
        }
      

  6.   

    不过另外的一种不能用HIBERNATE去操作数据库,只能用JDBCpackage com.jzaccp.oa.grbg.sessionlistener;import javax.servlet.http.*; 
    import javax.servlet.*; 
    import java.util.*; public class onLineUser implements HttpSessionBindingListener { 
         public onLineUser(){
       }    private Vector users=new Vector();
       /**
        * 获取在线人数
        * @return
        */
       public int getCount(){
            users.trimToSize();
           return users.capacity();
       }
       /**
        * 判断用户是否存在
        * @param userName
        * @return
        */
       public boolean existUser(String userName){     
       users.trimToSize();
           boolean existUser=false;
           for (int i=0;i<users.capacity();i++ )
           {
               if (userName.equals((String)users.get(i)))
               {
                   existUser=true;
                   break;
               }
           }
           return existUser;
       }
    /**
     * 删除用户
     * @param userName
     * @return
     */
       public boolean deleteUser(String userName) {
           users.trimToSize();
           if(existUser(userName)){
               int currUserIndex=-1;
               for(int i=0;i<users.capacity();i++){
                   if(userName.equals((String)users.get(i))){
                       currUserIndex=i;
                       break;
                   }
               }
               if (currUserIndex!=-1){
                   users.remove(currUserIndex);
                   users.trimToSize();
                   return true;
               }
           }
           return false;
       }
    /**
     * 得到用户的列表
     */
       public Vector getOnLineUser()
       {
           return users;
       }
       /**
        * 植入session时调用的方法
        * 
        */
         public void valueBound(HttpSessionBindingEvent e) { 
           users.trimToSize();
           if(!existUser(e.getName())){
               users.add(e.getName());
               System.out.print(e.getName()+"\t   登入到系统\t"+(new Date()));
               System.out.println("      在线用户数为:"+getCount());
           }else
               System.out.println(e.getName()+"已经存在");
         } 
    /**
     * 
     * session过期或被关闭或退出调用的方法
     */
         public void valueUnbound(HttpSessionBindingEvent e) { 
             users.trimToSize();
             String userName=e.getName();
             deleteUser(userName);
             System.out.print(userName+"\t   退出系统\t"+(new Date()));
             System.out.println("      在线用户数为:"+getCount());
           } } 
      

  7.   

    也就是说在执行事务的时候,执行了一部分,但是还没有执行完,Session失效了是吧。。失效就让重新登陆呗。执行的东西又不是没有保存,呵呵,一次谈判不成功可以再来过的嘛
      

  8.   

    用sesion监听(HttpSessionListener)在监听session销毁是的方法中执行你要进行的操作就可以了。