0

我正在研究基于彗星的会话注销系统,实际上我想检查用户会话是否处于活动状态,而无需每次都向服务器发送 ajax 请求。所以当用户第一次登录时,请求会发送到服务器(Servlet)并保持直到 sessionout(线程检查),线程如何为服务器上的每个用户处理会话。无法用线程实现,任何帮助将不胜感激。

4

2 回答 2

1

我认为一个线程每 1 分钟(或更少)检查一次整个会话,然后删除过期的会话,而且每个会话几乎不可能有自己的生命线程,这会使服务器变得很重。如果您尝试这样做,则需要一个线程(守护程序模式可以),在 1 分钟睡眠后检查所有会话,如下所示

class Foo implements Runnable{
List<Session> sessions;
public void run(){
while(true){
try{
Thread.sleep(60000);
synchronized(sessions){
for(Session sx:sessions){
 if(sx.isExpired()){sx.dispose();sessions.remove(sx);}
}
}
}catch(Exception e){}
}
}
}

我希望我的问题是正确的,可以帮忙:)

于 2013-10-09T14:24:59.183 回答
0

所以我的建议是将每个会话保留在全局引用中,就像单例类中的列表一样,然后该类还运行一个线程,每 1 分钟刷新一次每个会话,就像这样,但我不知道服务器刷新会话无论如何,使用 HttpServeltRequest 引用或 HttpSession 本身过期时间,因此您将保留请求或会话引用。

public class SessionHolder implements Runnable{
private List<HttpSession> sessions;
public void addSession(HttpSession s){sessions.add(s);}
public void removeSession(HttpSession s){Session.remove}
public void run(){
while (true){
try{
Thread.sleep(60000);
//refreshing sessions
for(HttpSession sx:sessions){
sx.setAttribute("noExpire","me again");//this may causes to refresh the session expire time
}
}catch(Exception e){}
}
}
}
于 2013-10-09T19:26:56.880 回答