积分是浮云 毕业设计 web聊天室 怎样判断用户已离线 session过期时ActionContext为空

tom_66 2011-03-07 09:30:01
积分是浮云,等级低,最多只能给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)

...全文
270 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
强长黑粗硬 2011-03-08
  • 打赏
  • 举报
回复
聊天功能我是客户端定时提交请求,然后查看有没有发给自己的消息。

至于消息的保存,到DB,放在内存,或者写到文件都随便
liguangwen86 2011-03-08
  • 打赏
  • 举报
回复
session 监听器可以看一下
李鸿远 2011-03-08
  • 打赏
  • 举报
回复
首先,你的session都失效了 ,ActionContext.getContext());肯定报空指针了;
其次,session的监听器只能判断你自己这个用户是否失效,设置过滤器也只能判断这个用户是否在session范围内存在而已;
这种情况你只能使用服务器级别的appliacation才行,session监听器拦截到你的用户已经失效,执行方法,把这个用户从application中remove掉,如果有用户进来,session监听器监听到,application增加一个用户;
tom_66 2011-03-08
  • 打赏
  • 举报
回复
聊天的那一块还没做,求好的思路和实现方法
tom_66 2011-03-08
  • 打赏
  • 举报
回复
经验少就是容易走弯路啊,刚把代码改了,既然取不到application就用static定义一个静态的
这个问题解决了。
以为页面一直在ajax刷新,所以用户在发呆session不会过期,关闭浏览器1分钟后session过期,终于得到想要的结果了。谢谢各位高手的指点。

晚上结贴,现在就做了登陆和统计在线用户和人数,还有就是聊天那一块,我也是用ajax不断刷新,取出数据库中在用户登陆后的所有聊天记录。

总感觉这样会出问题,希望各位高手继续指点思路,谢谢了
youjianbo_han_87 2011-03-08
  • 打赏
  • 举报
回复
在Server动态维护一个用户和状态的列表,轮询判断监测。不管是因为Session过期,还是用户离线操作。如果无法检查到该用户信息,统统视为离线,而不是简单判断Session里面有没有这个用户。
强长黑粗硬 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fclxyz 的回复:]
ActionContext().getContext()为空了,那怎样才能取到application对象呢?
[/Quote]

问一下,你用了几个用户登录到你的系统进行测试的?
是只有一个然后等着他超时?
如果多登陆几个用户,有一个超时,但是还有没超时的用户存在的时候,也会NullPointerException吗?

具体我没试过,你看看然后共享下结果呀,也学习下。
jackey_ctdw 2011-03-08
  • 打赏
  • 举报
回复
application 好想是直接取的吧
tom_66 2011-03-08
  • 打赏
  • 举报
回复
ActionContext().getContext()为空了,那怎样才能取到application对象呢?
tom_66 2011-03-08
  • 打赏
  • 举报
回复
设置一分钟是用来测试的,谢谢楼上
强长黑粗硬 2011-03-08
  • 打赏
  • 举报
回复
session超时,被服务器自动销毁,你拿到null也是正常吧。
你可以try一下,然后抓到nullPointerException之后,再做该用户退出处理。

不过你把session设为1分钟过期,如果该用户1分钟不说话,潜水潜了一分钟,是不是就自动被踢了?
一分钟太短了吧?

我以前的做法是,弄一个Map,静态的,用于保存活动用户,
用户每个动作之前(提交请求的时候),将该用户的信息保存到这个Map里面(这个可以在拦截器里面去完成),
key是该用户的Id(或者是sessionId),value是最后一次动作的时间。

这样看这个Map里面最近一分钟有所动作的用户那就是活动的,超过一分钟没动作了,那你爱怎么处理怎么处理。
不过我觉得一分钟不说话就session超时,有点太苛刻了。说不定谁说了个长篇的,大家得花好几分钟去理解消化呢。(或许你的一分钟只是个例子。。。。)
脉动回来 2011-03-07
  • 打赏
  • 举报
回复
考虑下 用 aplication 对象
zsj01005432 2011-03-07
  • 打赏
  • 举报
回复
个人觉得是不是与session过期有关系
tom_66 2011-03-07
  • 打赏
  • 举报
回复
只能发100分的帖子, 好像结贴的时候可以追加分的吧
如果结贴的时候可以追加分,回复的都至少给2分
回复觉得被采纳的最少给20
特别有帮助的至少50

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧