2013-10-09 18 views
0

我正在基于彗星的会话注销系统,其实我想检查用户会话是否活动或没有发送ajax请求每次到server.so当用户登录第一次,一个请求到达服务器(Servlet)并持续到sessionout(一个线程检查),一个线程如何处理server.unable上的每个用户的会话以便用线程实现,任何帮助都将不胜感激。无法处理基于彗星的线程在服务器端

回答

1

我认为一个线程每隔1分钟(或更少)检查整个会话人员,只是删除过期的会话,而且这几乎是不可能的,每个会话都有它自己的生命线程,使服务器变得沉重。 如果你试图做同样的,你需要一个线程(daemon模式会好起来的),一个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){} 
} 
} 
} 

我希望我的问题正确,可以给一些手:)

+0

如果100个用户登录一次,然后100请求将被搁置,所以怎么能servlet响应(彗星响应)哪个会话已被破坏 – raw

+0

你的意思是彗星响应特定用户'保持alive'连接? – 2013-10-09 16:35:23

+0

是的,如何处理该特定会话的彗星响应 – raw

0

所以我的建议是保持每个会话在一个全局引用,像一个单例类中的列表,然后该类还运行一个线程刷新每个会话每1分钟,像这样的事情,但我不DON知道服务器使用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){} 
} 
} 
}