spring session 實現單點登入
1、 到了這裡,spring-session 配置已經基本完成。下面我們在controller中對使用者登入進行驗證,並且在使用者session資訊不存在的時候,將使用者資訊儲存進session中,關鍵程式碼如下:
- @RequestMapping("/loginAuth")
- public String login(HttpServletRequest request, HttpServletResponse response,
-
@RequestParam Map<String, Object> params, Model model)
- if (request.getSession().getAttribute("username") != null) {
- logger.info("使用者名稱:" + request.getSession().getAttribute("username").toString());
- String userName = request.getSession().getAttribute("username").toString();
-
Map<String, String> user = UserUtils.getUserHap(userName);
- if (user == null) {
- request.setAttribute("info", "會話已失效,請重新登陸!");
- logger.info(request.getAttribute("info"));
- return"/login";
- }
- return"redirect:/";
- }
-
if (params.get("userOid") == null || params.get("password") ==
- return"/login";
- }
- String userName = params.get("userOid") == "" ? "" : params.get("userOid").toString();
- String password = params.get("password") == "" ? "" : params.get("password").toString();
- String url = params.get("url") == "" ? "" : params.get("url").toString();
- logger.info("login params: " + params);
- HttpSession session = request.getSession(false);
- Map<String, String> user = UserUtils.getUserHap(userName);
- logger.info(user);
- if (UserUtils.authenticatePasswordHap(password, user.get("PASSWORD_ENCRYPTED"))) {
- logger.info("驗證通過");
- session.setAttribute("userId", Long.valueOf(user.get("USER_ID")));
- session.setAttribute("username", user.get("USER_NAME"));
- session.setAttribute("userName", user.get("USER_NAME"));
- session.setAttribute("displayName", user.get("USER_NAME"));
- session.setAttribute("locale", "zh_CN");
- long roleId = getUserRoleId(Long.valueOf(user.get("USER_ID")));
- session.setAttribute("roleId", roleId);
- session.setAttribute("timeZone", "GMT+0800");
- if (request.getParameter("url") != null && !request.getParameter("url").isEmpty()
- && !"null".equals(request.getParameter("url"))) {
- url = java.net.URLDecoder.decode(request.getParameter("url"), "utf-8");
- System.out.println(url);
- return"redirect:" + url;
- }
- return"dashborad";
- } else {
- logger.info("驗證不通過");
- if (userName == "" && password == "") {
- request.setAttribute("info", "請輸入使用者名稱或密碼!");
- } elseif (userName == "") {
- request.setAttribute("info", "請輸入使用者名稱!");
- } elseif (password == "") {
- request.setAttribute("info", "請輸入密碼!");
- } else {
- request.setAttribute("info", "使用者名稱或密碼錯誤!");
- }
- logger.info(request.getAttribute("info"));
- return"/login";
- }
- }
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配置成功。