1. 程式人生 > >總結一下我做的單點登入步驟

總結一下我做的單點登入步驟

以前做的一個簡單的單點登入,就是那種這面上線,另一面就直接踢下線的那種單點登入,不是一次登入各個系統都能用的那個單點哦

流程大概就是     先進行登入操作,然後把使用者生成的session儲存到一個map集合中,key只要你能找到一個唯一的用什麼隨便,value是session

對於這一個操作我寫了一個監聽具體程式碼如下

public class OnLineUserListenner implements HttpSessionAttributeListener{
	/***
	 * 只要向HttpSession中存放資料就會呼叫此方法
	 */
	@Override
	public synchronized void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
		//獲取session
		HttpSession session = httpSessionBindingEvent.getSession();
		//得到上下文
		ServletContext servletContext = session.getServletContext();
		//從session中獲取user物件
		Object object = session.getAttribute(SystemConstants.IUSER);
		//判斷是否是後臺使用者的User物件
		if(null != object && object instanceof User){
			//查詢已有的資訊
			Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext.getAttribute(SystemConstants.IUSER);
			//判斷是否為空。如果沒有則新建
			if(null == map){
				map = new HashMap<String, HttpSession>();
			}
			//將使用者的資訊和session儲存到map中
			map.put(((User)object).getLoginName(), session);
			//存入servletContext
			servletContext.setAttribute(SystemConstants.IUSER, map);
			//System.out.println("當前有"+map.size()+"個使用者登陸-----------");
		}
	}
	/**
	 * 刪除session的時候會呼叫此方法
	 */
	@Override
	public synchronized void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
		// TODO Auto-generated method stub
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
以上程式碼是當你操作httpSession,新增資料時候呼叫,具體是怎麼把使用者的當前session和使用者關聯起來註釋都有寫就不墨跡了

然後就是當你需要踢掉登入的使用者的時候需要的監聽了

public class SessionListenner implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent paramHttpSessionEvent) {
		// TODO Auto-generated method stub
		
	}
	/**
	 * session銷燬的時候呼叫
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent paramHttpSessionEvent) {
		//獲取sesssion
		HttpSession session = paramHttpSessionEvent.getSession();
//		System.out.println(session+"被銷燬");
		//從session中獲取user物件
		Object object = session.getAttribute(SystemConstants.IUSER);
		//判斷是否是後臺使用者的User物件
		if(null != object && object instanceof User){
			//得到上下文
			ServletContext servletContext = session.getServletContext();
			//查詢已有的資訊
			Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext.getAttribute(SystemConstants.IUSER);
			//如果不為空,清空改使用者資訊
			if(null != map){
				map.remove(((User)object).getLoginName());
			}
		}
	}

}

這個session銷燬方法將在httpsession呼叫自己的invalidate方法時執行主要作用就是在儲存這所有登入使用者的session中刪除掉當前要登出這個使用者的session

到這裡單點登入的主要類就完成了。然後就需要各位根據需要自己修改一下了,本文章僅供自己檢視使用,別人使用出現問題,本人概不負責

還有一個附屬的類,主要是用來完成呼叫登出session

public static void SignOut(HttpServletRequest request,
			HttpServletResponse response, User user) {
		// 獲取session
		HttpSession session = request.getSession(true);
		// 得到上下文
		ServletContext servletContext = session.getServletContext();
		// 查詢已有的資訊
		Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext
				.getAttribute(SystemConstants.IUSER);
		if (null != map) {
			//這裡是找到了當前登入使用者的session
                        HttpSession userSession = map.get(user.getLoginName());
			if (userSession != null) {
				// 清空使用者session也就是銷燬了當前使用者的session
				userSession.invalidate();
				// 移除map中的使用者和session
				map.remove(user.getLoginName());
			}
		}
	}