积分是浮云,等级低,最多只能给100
相关问题新发帖昨天发了个相关的帖子,按照某高手的回复去查了下侦听器的用法。
发现当在程序中调用ActionContext.getContext().getSession().remove("user");时,可以清除session并删除application中对应的user(name)
我设置session 1分钟过期,然后不点退出按钮,直接关闭浏览器,一分钟后后台报异常
侦听器类public class MyListener implements HttpSessionAttributeListener{}
请问为什么 actionContext: null?怎样解决。public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
if ("user".equals(se.getName())) {
User user = (User) se.getValue();
System.out.println(user.getName() + " has logout");
System.out.println("actionContext: "+ActionContext.getContext());
Set<String> onLineUsers = (Set<String>) ActionContext.getContext()
.getApplication().get("onLineUsers");
onLineUsers.remove(user.getName());
ActionContext.getContext().getApplication().put("onLineUsers",
onLineUsers);
System.out.println(onLineUsers.size());
UserAction.count--;
}
}
//当关闭浏览器session过期时发生异常
fan has logout
actionContext: null
2011-3-7 21:19:25 org.apache.catalina.session.StandardSession removeAttributeInternal
严重: Session attribute event listener threw exception
java.lang.NullPointerException
at com.hisoft.util.MyListener.attributeRemoved(MyListener.java:41)
at org.apache.catalina.session.StandardSession.removeAttributeInternal(StandardSession.java:1675)
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:756)
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:592)
at org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:682)
at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:667)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1316)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:662)

解决方案 »

  1.   

    个人觉得是不是与session过期有关系
      

  2.   

    考虑下 用 aplication 对象
      

  3.   

    session超时,被服务器自动销毁,你拿到null也是正常吧。
    你可以try一下,然后抓到nullPointerException之后,再做该用户退出处理。不过你把session设为1分钟过期,如果该用户1分钟不说话,潜水潜了一分钟,是不是就自动被踢了?
    一分钟太短了吧?我以前的做法是,弄一个Map,静态的,用于保存活动用户,
    用户每个动作之前(提交请求的时候),将该用户的信息保存到这个Map里面(这个可以在拦截器里面去完成),
    key是该用户的Id(或者是sessionId),value是最后一次动作的时间。这样看这个Map里面最近一分钟有所动作的用户那就是活动的,超过一分钟没动作了,那你爱怎么处理怎么处理。
    不过我觉得一分钟不说话就session超时,有点太苛刻了。说不定谁说了个长篇的,大家得花好几分钟去理解消化呢。(或许你的一分钟只是个例子。)
      

  4.   

    ActionContext().getContext()为空了,那怎样才能取到application对象呢?
      

  5.   

    application  好想是直接取的吧
      

  6.   


    问一下,你用了几个用户登录到你的系统进行测试的?
    是只有一个然后等着他超时?
    如果多登陆几个用户,有一个超时,但是还有没超时的用户存在的时候,也会NullPointerException吗?具体我没试过,你看看然后共享下结果呀,也学习下。
      

  7.   

    在Server动态维护一个用户和状态的列表,轮询判断监测。不管是因为Session过期,还是用户离线操作。如果无法检查到该用户信息,统统视为离线,而不是简单判断Session里面有没有这个用户。
      

  8.   

    经验少就是容易走弯路啊,刚把代码改了,既然取不到application就用static定义一个静态的
    这个问题解决了。
    以为页面一直在ajax刷新,所以用户在发呆session不会过期,关闭浏览器1分钟后session过期,终于得到想要的结果了。谢谢各位高手的指点。晚上结贴,现在就做了登陆和统计在线用户和人数,还有就是聊天那一块,我也是用ajax不断刷新,取出数据库中在用户登陆后的所有聊天记录。总感觉这样会出问题,希望各位高手继续指点思路,谢谢了
      

  9.   

    首先,你的session都失效了 ,ActionContext.getContext());肯定报空指针了;
    其次,session的监听器只能判断你自己这个用户是否失效,设置过滤器也只能判断这个用户是否在session范围内存在而已;
    这种情况你只能使用服务器级别的appliacation才行,session监听器拦截到你的用户已经失效,执行方法,把这个用户从application中remove掉,如果有用户进来,session监听器监听到,application增加一个用户;