1.SSO 概述java
單點登陸(Single Sign On ), 是目前比較流行的企業業務整合解決方案之一. 在企業中存在多個業務系統, 用戶只須要登陸一次就能夠訪問這些彼此信任的業務系統.web
1.1 SSO體系結構chrome
單點登錄包括了四個組件:認證中心, 用戶與賬號系統&用戶數據獲取接口, 客戶端模塊, 令牌瀏覽器
1.1.1 認證中心 [全部業務系統都共享一個認證中心] (服務端)服務器
1.1.2 用戶與賬號系統&用戶數據獲取接口 (服務端提供統一認證 用戶數據 的接口)cookie
1.1.3 客戶端模塊session
1.1.4 令牌(token)dom
2. SSO認證流程ide
認證流程: 當用戶經過瀏覽器發起了業務資源的請求, 服務器會檢測token[鑰匙]是否存在; 若是token存在, 服務器繼續校驗token是否有效, 若是token有效, 用戶就成功訪問業務系統, 若是token無效, 瀏覽器Redirect到登陸頁面; token不存在,瀏覽器Redirect到SSO的用戶與賬號系統模塊, 提示用戶輸入用戶名和密碼來進行受權, 受權成功後, 服務器將生成的token傳遞給瀏覽器, 用戶攜帶剛生成的token再次發起請求,完成業務資源的訪問.工具
上面是關於SSO的大體流程圖, 如今須要經過JAVA代碼來具體實操.
SSO相關核心技術:
1. HTTP協議, cookie與session
2. cookie與session的關係
3. cookie SSO令牌的載體
4. 決定cookie內容 生命週期 和有效範圍的7個屬性
1. name和value
2. expires (過時時間)
3. path和domain
4.httponly 和secure
import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/path1/cookie-servlet") public class CookieServlet extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { //讀取cookie Cookie[] cookies = request.getCookies(); if( cookies != null) { for (Cookie cookie : cookies) { System.out.println(cookie.getName()+ ", " + cookie.getValue() + ", " + cookie.getMaxAge() + ", " + cookie.getPath() + ", " + cookie.getDomain() + ", " + cookie.getSecure() + ", " + cookie.isHttpOnly()); } } //寫cookie Cookie cookie = new Cookie("cookie1", String.valueOf(System.currentTimeMillis())); // 1. name和value cookie.setMaxAge(12*60*60); //2. expires (過時時間) cookie.setPath("/"); //cookie.setDomain("localhost") // 3. path和domain //4.httponly 和 secure cookie.setHttpOnly(false); // JavaScript不能處理 cookie.setSecure(false); // 若是爲true,僅支持HTTPS協議 response.addCookie(cookie); } }
Ctrl+shift+N 新建一個隱身窗口, 發起第一次get請求, 打開chrome開發工具, 查看network 下的 cookies ,發現瀏覽器有兩個Map key 分別爲 Request Cookies Response Cookies; 因爲是第一次發起請求, 因此瀏覽器沒有找到相應的cookie(token)[圖1]. 在代碼裏, 也沒有輸出對應的瀏覽器發送過來的cookie;
此時刷新瀏覽器, 一樣查看cookie[圖2], 發現Request cookie 裏攜帶了一個值和第一次get請求ResonseCookies的值是同樣的.
圖1
圖2
5. JavaScript操做cookie的方法
6. Java web應用中操做cookie的方法
7. filter, WEB層的攔截器