1.在分佈式系統架構下是每個系統都是由一個團隊進行維護,每一個系統都是單獨部署運行一個單獨的應用容器如Tomcat,因此,不能將用戶的登陸信息保存到session中。java
多個tomcat的session通常是不能共享的,雖然咱們能夠利用tomcat自身的session同步功能,但隨着機器和業務量增長,效率會愈來愈低。並且這樣作會使業務和Tomcat嚴重耦
合,不利於擴展,因此咱們須要一個單獨的系統來維護用戶的登陸信息,這個系統就是SSO即單點登陸系統。數據庫
單點登陸是一個熱門話題,是指在多系統應用羣中登陸一個系統,即可在其餘全部系統中獲得受權而無需再次登陸,包括單點登陸與單點註銷兩部分。數組
2.單點登陸系統因爲其特殊性,不能使用容器的session,只能由用戶本身基於session的性質從新開發一套有狀態的會話保持系統。
3.解釋tomcat
傳統的session是將用戶信息存入內存,維護一個哈希表。每一次請求攜帶JSESSIONID到服務端,根據此JSESSIONID查找到對應的用戶信息。
由此出發咱們想到能夠利用Redis等內存數據庫進行用戶信息的存儲,自定義Token生成規則將用戶信息寫入Redis中。這樣將用戶信息的存儲和業務系統進行拆分,使系統更加健
壯,更易於擴展。新加的系統只須要從SSO中獲取相關的認證便可進行橫向的業務擴展。並且Redis自己的性質也易於進行集羣化的部署。cookie
5.StringUtils.isEmpty(userJsonData)是Apache commoms-lang包的工具類。
6.URLDecoder.decode(cookie.getValue(), "UTF-8"),解碼。URLEncoder是java.net包裏的工具類
7.注意,cookie並非集合,而是就是一個鍵值對,只是一對。一個cookie也只能存儲一對鍵值對信息。
8.若是要存儲多個鍵值對,就要用多個cookie來存儲。
request.getCoookies()能得到cookie數組,
如:/**
47 * 取得cookie的值
48 * @param request
49 * @param key cookie主鍵
50 */
51 public static String getCookieValue(HttpServletRequest request, String key) throws UnsupportedEncodingException{
52 for(Cookie cookie : request.getCookies()){
53 if (cookie.getName().equals(key)) {
54 return URLDecoder.decode(cookie.getValue(), "UTF-8");
55 }
56 }
57 return null;
58 }
59 }
6.cookie和session全是hashmap,裏面全是鍵值對。能夠添加、刪除、獲取cookie/session裏的key和value。
/**
14 * 添加cookie
15 * @param response
16 * @param key cookie主鍵
17 * @param value cookie值
18 */
19 public static void addCookie(HttpServletResponse response, String key, String value){
20 Cookie cookie = new Cookie(key, value);
21 cookie.setPath("/");// 這個要設置
22 cookie.setMaxAge(60*60*24*30);//保留一個月 以秒爲單位
23 response.addCookie(cookie);session
/**
27 * 刪除cookie
28 * @param request
29 * @param response
30 * @param key cookie主鍵
31 */
32 public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String key){
33 Cookie cookies[] = request.getCookies();
34 if (cookies != null) {
35 for (int i = 0; i < cookies.length; i++) {
36 if (cookies[i].getName().equals(key)) {
37 Cookie cookie = new Cookie(key,null);
38 cookie.setPath("/");//設置成跟寫入cookies同樣的
39 cookie.setMaxAge(0);
40 response.addCookie(cookie);
41 }
42 }
43 }
44 }
45 架構
20.name=new String(name.getBytes("iso8859-1"),"UTF-8");分佈式