我正在研究一个基于彗星的会话注销系统,实际上我想检查用户会话是否处于活动状态,而不是每次都向服务器发送ajax请求。因此,当用户第一次登录时,请求进入服务器(Servlet) )并保持到sessionout(一个线程检查),一个线程如何处理server.unable上的每个用户的会话以实现线程,任何帮助将不胜感激。
答案 0 :(得分: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){}
}
}
}
我希望我的问题是正确的,并可以伸出援助之手:)
答案 1 :(得分: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){}
}
}
}