1. 程式人生 > >spring session 實現單點登入

spring session 實現單點登入

1、   到了這裡,spring-session 配置已經基本完成。下面我們在controller中對使用者登入進行驗證,並且在使用者session資訊不存在的時候,將使用者資訊儲存進session中,關鍵程式碼如下:

  1. @RequestMapping("/loginAuth")  
  2. public String login(HttpServletRequest request, HttpServletResponse response,  
  3.         @RequestParam Map<String, Object> params, Model model) 
    throws UnsupportedEncodingException {  
  4.     if (request.getSession().getAttribute("username") != null) {  
  5.         logger.info("使用者名稱:" + request.getSession().getAttribute("username").toString());  
  6.         String userName = request.getSession().getAttribute("username").toString();  
  7.         Map<String, String> user = UserUtils.getUserHap(userName);  
  8.         if (user == null) {  
  9.             request.setAttribute("info""會話已失效,請重新登陸!");  
  10.             logger.info(request.getAttribute("info"));  
  11.             return"/login";  
  12.         }  
  13.         return"redirect:/";  
  14.     }  
  15.     if (params.get("userOid") == null || params.get("password") == 
    null) {  
  16.         return"/login";  
  17.     }  
  18.     String userName = params.get("userOid") == "" ? "" : params.get("userOid").toString();  
  19.     String password = params.get("password") == "" ? "" : params.get("password").toString();  
  20.     String url = params.get("url") == "" ? "" : params.get("url").toString();  
  21.     logger.info("login params: " + params);  
  22.     HttpSession session = request.getSession(false);  
  23.     Map<String, String> user = UserUtils.getUserHap(userName);  
  24.     logger.info(user);  
  25.     if (UserUtils.authenticatePasswordHap(password, user.get("PASSWORD_ENCRYPTED"))) {  
  26.         logger.info("驗證通過");  
  27.         session.setAttribute("userId", Long.valueOf(user.get("USER_ID")));  
  28.         session.setAttribute("username", user.get("USER_NAME"));  
  29.         session.setAttribute("userName", user.get("USER_NAME"));   
  30.         session.setAttribute("displayName", user.get("USER_NAME"));  
  31.         session.setAttribute("locale""zh_CN");  
  32.         long roleId = getUserRoleId(Long.valueOf(user.get("USER_ID")));  
  33.         session.setAttribute("roleId", roleId);  
  34.         session.setAttribute("timeZone""GMT+0800");  
  35.         if (request.getParameter("url") != null && !request.getParameter("url").isEmpty()  
  36.                 && !"null".equals(request.getParameter("url"))) {  
  37.             url = java.net.URLDecoder.decode(request.getParameter("url"), "utf-8");  
  38.             System.out.println(url);  
  39.             return"redirect:" + url;  
  40.         }  
  41.         return"dashborad";  
  42.     } else {  
  43.         logger.info("驗證不通過");  
  44.         if (userName == "" && password == "") {  
  45.             request.setAttribute("info""請輸入使用者名稱或密碼!");  
  46.         } elseif (userName == "") {  
  47.             request.setAttribute("info""請輸入使用者名稱!");  
  48.         } elseif (password == "") {  
  49.             request.setAttribute("info""請輸入密碼!");  
  50.         } else {  
  51.             request.setAttribute("info""使用者名稱或密碼錯誤!");  
  52.         }  
  53.         logger.info(request.getAttribute("info"));  
  54.         return"/login";  
  55.     }  
  56. }  


2、   完成上述工作,我們將兩個工程都部署到tomcat伺服器下,啟動tomcat伺服器,進行以下測試:

先訪問HspAdmin,在瀏覽器中輸入localhost:8088/HspAdmin/(我的tomcat埠設定的是8088)這時因為session資訊不存在,被HspAdmin這個工程中的攔截器(兩個工程都設有攔截器的)攔截下來,所以我們看到 了使用者登入介面。

關閉瀏覽器的標籤頁,在新的標籤頁中輸入localhost:8088/ServiceMontior/同樣看到使用者登入介面,不過我們這次選中登入。

登入之後,可以看到HspServiceMontior這個工程的主介面。

開啟瀏覽器新標籤頁,再次輸入localhost:8088/HspAdmin/,這一次不一樣的事情發生了,我們不再是看到使用者登入介面,而是直接看到HspAdmin這個工程的主介面。

下面對是一個簡單的分析:第一次我們訪問HspAdmin,因為沒有沒有sessio為空,所以被攔截器攔截下來,這時我們跳到登入介面;然後我們訪問HspServiceMontior,同樣因為session為空,我們跳轉到登入介面,當我們登入HspServiceMontior之後,這時使用者資訊已經被儲存在session中了,而兩個工程的session又都被配置成儲存在redis資料庫中的同一個位置,所以我們再次訪問HspAdmin時,沒有再跳轉到登入介面,而是直接跳轉到主介面,這也就間接說明spring-session配置成功。