在程序的配置文件中设置session的失效时间是30分钟,在session失效的时候自动调用一个事务完成一些操作,请问具体该怎么实现,怎样让页面知道session是不是已经失效,并且做一些反映,应该会用到监听器,请问怎么实现。

解决方案 »

  1.   

    Http Session Listener监听Http Session的操作。当创建一个Session时,激发session Created(Http Session Event se)方法;当销毁一个Session时,激发session Destroyed (Http Session Event se)方法。
      

  2.   

    看看这个吧public class SessionListener implements HttpSessionAttributeListener {
    /**
     * 保存sessionID和用户帐号
     */
    private static Map<String, String> users = new HashMap<String, String>() ;

    /**
     * 保存sessionID和管理员帐号
     */
    private static Map<String, String> admins = new HashMap<String, String>();


    public void attributeAdded(HttpSessionBindingEvent arg0) {
    System.out.println("-----------------------" + arg0.getName());
    System.out.println("+++++++++++++++++++++++" + arg0.getSession().getId());

    if("current_user".equals(arg0.getName())) {
    users.put(arg0.getSession().getId(), ((User)arg0.getValue()).getUserCode()); } else if("current_admin".equals(arg0.getName())) {
    admins.put(arg0.getSession().getId(), ((Administrator)arg0.getValue()).getAdminCode()); }
    }

    public void attributeRemoved(HttpSessionBindingEvent arg0) {
    System.out.println("-----------------------" + arg0.getName());
    System.out.println("+++++++++++++++++++++++" + arg0.getSession().getId());

    if("current_user".equals(arg0.getName())) {
    if(users.containsValue(((User)arg0.getValue()).getUserCode())) {
    Iterator<Map.Entry<String, String>> it = users.entrySet().iterator();
    while(it.hasNext()) {
    Map.Entry<String, String> m = it.next();
    String key = m.getKey();
    String val = m.getValue();
    if(val.equals(((User)arg0.getValue()).getUserCode())) {
    users.remove(key);
    break;
    }
    }
    }
    } else if("current_admin".equals(arg0.getName())) {
    if(admins.containsValue(((Administrator)arg0.getValue()).getAdminCode())) {
    Iterator<Map.Entry<String, String>> it = admins.entrySet().iterator();
    while(it.hasNext()) {
    Map.Entry<String, String> m = it.next();
    String key = m.getKey();
    String val = m.getValue();
    if(val.equals(((Administrator)arg0.getValue()).getAdminCode())) {
    admins.remove(key);
    break;
    }
    }
    }
    }
    }

    public void attributeReplaced(HttpSessionBindingEvent arg0) {
    System.out.println("-----------------------" + arg0.getName());
    }

    public static Map<String, String> getAdmins() {
    return admins;
    }

    public static Map<String, String> getUsers() {
    return users;
    }
    }
      

  3.   

    还有一定。如果使用全局监听。请在web.xml中配置如果使用特定类监听。请注意,只有在session中将监听类添加/移除 操作时才会触发事件,调用相应方法。