總結一下我做的單點登入步驟
阿新 • • 發佈:2019-02-12
以前做的一個簡單的單點登入,就是那種這面上線,另一面就直接踢下線的那種單點登入,不是一次登入各個系統都能用的那個單點哦
流程大概就是 先進行登入操作,然後把使用者生成的session儲存到一個map集合中,key只要你能找到一個唯一的用什麼隨便,value是session
對於這一個操作我寫了一個監聽具體程式碼如下
以上程式碼是當你操作httpSession,新增資料時候呼叫,具體是怎麼把使用者的當前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 } }
然後就是當你需要踢掉登入的使用者的時候需要的監聽了
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()); } } }