Listener實現單態登錄

一個賬號只能在一臺機器上登錄,如果在其他機器上登錄,則原來的session自動失效。利用Listener實現單態登錄,不會與Servlet有任何的耦合!前後臺登錄相關代碼省略。。。。注意在登錄成功後將用戶對象加入session,前臺每個頁面需要每間隔5000毫秒左右檢測用戶session是否爲null,所以建議把前臺檢測session相關代碼放在一個通用頁面。如果是null的說明賬號在其他機器上登錄,你的session被remove了。這時常規做法是給用戶提示,並彈登錄界面!下面是主要是監聽器核心代碼部分。

package com.zh.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.hr.entity.Sysuuser;
/**
 * 實現單態登錄
 * @author Administrator
 *
 */
public class LogonSeionListener implements HttpSessionAttributeListener{
	 Map<String,HttpSession> map = new HashMap<String, HttpSession>();
	 
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		String name = event.getName();
		if(name.equals("user")){
			Sysuuser user= (Sysuuser) event.getValue();
			//若Map中存在改賬號
			if(map.get(user.getUsruname())!=null){
				//map集合中有記錄,表示該賬號在其他機器上登錄過
				HttpSession session=map.get(user.getUsruname());
				Sysuuser oldsysuuser=(Sysuuser)session.getAttribute("user");
				session.removeAttribute("user");
				session.setAttribute("msg","您的賬號在其他機器上登錄,您被迫下線");
			}
			//將session以用戶名爲索引,放入Map
			map.put(user.getUsruname(),event.getSession());
		}
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		String name = event.getName();
		if(name.equals("user")){
			Sysuuser oldsysuuser= (Sysuuser) event.getValue();
			map.remove(oldsysuuser.getUsruname());
		}
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		String name = event.getName();
		if(name.equals("user")){
			Sysuuser oldsysuuser= (Sysuuser) event.getValue();
			//移除舊的登錄信息
			map.remove(oldsysuuser.getUsruname());
			Sysuuser user= (Sysuuser) event.getSession().getAttribute("user");
			if(map.get(user.getUsruname())!=null){
				//map集合中有記錄,表示該賬號在其他機器上登錄過
				HttpSession session=map.get(user.getUsruname());
			    session.removeAttribute("user");
				session.setAttribute("msg","您的賬號在其他機器上登錄,您被迫下線");
			}
			map.put(user.getUsruname(),event.getSession());
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章