web.xml设置
<session-config> 
    <session-timeout>15</session-timeout> 
</session-config> 
今天有一个用户说昨天突然断电,今天早上登录不了系统,我很奇怪为什么session没有失效。
白天一般有100多人同时在线,不能重启weblogic服务,有其他方法干掉该用户session吗?

解决方案 »

  1.   

    ps -ef|grep 用户名
    然后kill掉,你试试看好用不
      

  2.   

    根session毛的关系,如果是单点登录的,你还是检查一下你的程序,可能是记在数据库的信息没有清掉
      

  3.   

    是不是单点登录?不是的话,应该是用户自己的问题吧?另外,使用cookie没?检查一下。session肯定早清空了,没有关系。看看其他方面的问题吧。
      

  4.   

    不是单点登录,也没有用cookie。我只是把已登录的userid存放到一个sessionlistener的list对象里,用它来判断用户是否重复登录。
    这个情况只出现过一次,那次是用户登录系统后,他那边突然停电造成的
      

  5.   

    那你什么时候清理这个list对象啊?sessionlistener对session超时事件怎么处理的?
      

  6.   

    web.xml里有设session的实效时间,如果正常退出会清除sessionlistener里的session对象,非正常退出也就是关闭网页也测试了没有问题。碰到的感觉就是个特例,3个月只碰到了1次
      

  7.   

    这个sessionlistener是Application级别的吧,那就跟session时间无关了,关闭网页跟断电不一样,关闭网页你可以有个onunload事件通知一下服务器,断电就跟浏览器崩溃一样,是不会通知服务器的,不信你把网页的那个onunload去掉后关掉网页试试,sessionlistener中的userid会不会清掉
      

  8.   

    <session-config> 
      <session-timeout>15</session-timeout> 
    </session-config>  我靠,不是把,看看有没有异常信息。或者提示。 15分钟,你都7个小时
      

  9.   


    list看看这个对象是如何存储的,可能没清除,你应该用线程去处理下userid,当多长时间,该userid没有再用就立即清除。
      

  10.   

    package com.banner.servlet;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;public class OnlineUserBindingListener implements HttpSessionBindingListener {
      String username;
        public OnlineUserBindingListener(){
        }
        
        public OnlineUserBindingListener(String username){
            this.username=username;
        }
        public void valueBound(HttpSessionBindingEvent event) {
            HttpSession session = event.getSession();
            ServletContext application = session.getServletContext();
            // 把用户名放入在线列表
            List onlineUserList = (List) application.getAttribute("onlineUserList");
            // 第一次使用前,需要初始化
            if (onlineUserList == null) {
                onlineUserList = new ArrayList();
                
            }
            onlineUserList.add(this.username);
            application.setAttribute("onlineUserList", onlineUserList);
        }     public void valueUnbound(HttpSessionBindingEvent event) {
            HttpSession session = event.getSession();
            ServletContext application = session.getServletContext();         // 从在线列表中删除用户名
            List onlineUserList = (List) application.getAttribute("onlineUserList");
            onlineUserList.remove(this.username);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            System.out.println(this.username + "退出系统。");
            System.out.println("退出时间"+sdf.format(new Date()));
        }
        
    }
    测试的时候,我关闭网页15分钟后还是可以登录的,上面是我的sessionlistener。出现这个状况是特例,大多数还是能清除的
      

  11.   


    public void valueBound(HttpSessionBindingEvent event) {
                HttpSession session = event.getSession();
                ServletContext application = session.getServletContext();
                // 把用户名放入在线列表
                List onlineUserList = (List) application.getAttribute("onlineUserList");
                // 第一次使用前,需要初始化
                if (onlineUserList == null) {
                    onlineUserList = new ArrayList();
                    
                }
                onlineUserList.add(this.username);
                application.setAttribute("onlineUserList", onlineUserList);
            }看不出什么问题,只有一个建议,在  onlineUserList.add(this.username); 之前,应该检查一下username是否已经存在,(onlineUserList.contains(this.username)),判定不存在再调用onlineUserList.add(this.username);
      

  12.   

    没有错误,出现的问题是那个用户的session还存在,应该怎么把session 干掉。
      

  13.   

    session还存在,那不重复登陆了?
      

  14.   

    所以我问的就是用什么办法干掉该用户session
      

  15.   

    写一个jsp放到服务器上jsp中嵌入代码
    HttpSession session = request.getSession();
                ServletContext application = session.getServletContext();
                // 把用户名放入在线列表
                List onlineUserList = (List) application.getAttribute("onlineUserList");
    //从onlineUserList里移除该用户的用户名
    onlineUserList.remove("username");
    通过访问此jsp,使代码运行
      

  16.   

    正常退出我写了这个代码,非正常退出写在jsp的代码就没有用了。
    只能靠sessionlistener来判断
      

  17.   

    那不对啊,如果session没失效,用户再开浏览器访问应该是新session了啊?
      

  18.   

    不是session新旧的问题,是通过sessionlistener 查看该用户的userid是否存在
      

  19.   


    ServletContext application = session.getServletContext();
                // 把用户名放入在线列表
                List onlineUserList = (List) application.getAttribute("onlineUserList");这个application不是只在sessionlistenner里才能拿到的啊,在jsp里一样可以拿到并且进行操作啊。这样不就可以检查用户的userid是否存在了?
      

  20.   

    个人认为不是session的问题 应该是程序的问题,