SSO 系統分析、SSO工程搭建、單點登錄接口文檔分析及Service層接口開發併發布、單點登錄檢查數據是否可用-Controller層及測試

SSO 系統分析

一、什麼是SSO系統?
SSO英文全稱Single Sign On,單點登錄。SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用於同一個用戶的登錄的機制。它是目前比較流行的企業業務整合的解決方案之一。

二、爲什麼要有單點登錄系統?
2.1 傳統的登錄實現方式
登陸後—》session《—訪問別的頁面
這種登錄方式對只有一個web工程的情況下是沒有問題的,但是對於分佈式系統來說,由於牽扯到多個系統,如果每訪問一個系統都要輸入一遍用戶名、密碼的話那將非常麻煩,也是用戶所不能忍受的,這時單點登錄便派上用場了。

2.2 集羣模式下的登錄方式
用戶—》負載均衡服務器nginx—〉1.訪問用戶中心要求用戶登陸(tomcat1. webapp[session User1])
—》2.刷新頁面,要求用戶再次登陸(tomcat2. webapp[session User1])

集羣和分佈式的區別在於,集羣是多臺設備幹同一件事情,而分佈式是不同的設備幹不同的事情。傳統模式的工程當用戶訪問量大的時候就難以招架了,這時首先考慮到的是使用集羣來增加網站的吞吐量,一個tomcat可以處理大約300個併發,多個tomcat就可以處理更多的併發。但是tomcat集羣有一個致命的瓶頸,那就是session共享,由於不同的tomcat之間要以廣播的方式來進行session共享,當tomcat數量較多時,廣播便佔據了絕大多數帶寬,從而使真正的請求難以被處理,一般來說,tomcat集羣中tomcat的個數不要超過5個。

2.3 集羣與分佈式架構
用戶—》負載均衡服務器nginx—〉1.訪問用戶中心要求用戶登陸(tomcat1. webapp[session User1])
—》2.刷新頁面,要求用戶再次登陸(tomcat2. webapp[session User1])
—》登陸處理 session服務器(SSO系統)登陸頁面【Session User1】. ---->Redis服務器

與單純的集羣相比,把登錄單獨拿出來,可以使用Session服務器,保存Session信息,使每個節點是無狀態。需要模擬Session。單點登錄系統是使用redis模擬Session,實現Session的統一管理。登錄獨立的好處便是解決了session共享的問題,這樣集羣便可以幾乎不受限制的進行擴展。

SSO工程搭建

首先,我們還是再看一下淘淘商城的系統架構,到目前爲止,我們已經做了後臺管理系統、商城門戶、搜索系統、商品服務、內容服務、搜索服務、緩存redis、Solr服務、索引庫、消息隊列ActiveMQ。還未實現的部分是會員系統、訂單系統、單點登錄服務、訂單服務、持久層。我們這節要搭建的工程便是會員系統和單點登錄服務。
在這裏插入圖片描述

下面我們便開始搭建工程,首先來搭建單點登錄服務系統taotao-sso,這個工程是個pom(聚合)工程,包含兩個子模塊,taotao-sso-interface、taotao-sso-service。

File----->New------>Other------>Maven------->Maven Project------->勾選"Create a simple project (skip archetype selection)“之後便看到如下圖所示界面。填完相應信息後點擊"Finish”。

修改taotao-sso工程的pom.xml文件,添加對taotao-common的依賴以及配置tomcat插件(大家可以參考taotao-manager工程的pom.xml文件)tomcat端口號爲8087

下面新建taotao-sso聚合工程的兩個子工程,首先新建taotao-sso-interface工程,包方式默認就是jar,我們不用動 修改taotao-sso-interface工程的pom.xml文件,添加如下圖所示依賴。

下面我們新建taotao-sso-service工程,它也是一個模塊,打包方式中選擇"war", 修改taotao-sso-service工程的pom.xml文件,添加一些依賴,修改後的pom.xml文件
下面把taotao-manager-service工程的src/main/resources目錄下的文件拷貝過來,mybatis目錄下的SqlMapConfig.xml文件不用修改
properties目錄下的db.properties文件我們也不用修改
resource.properties文件內容我們清空就可以了
下面看spring目錄下的applicationContext-dao.xml文件的內容也不用動。
spring目錄下的applicationContext-jedis.xml文件我們也原封不動的留着
既然要保留jedis的配置文件就需要把相關包和類拷貝過來,我們參考taotao-content-interface和taotao-content-service工程,將taotao-content-interface工程下的"com.taotao.jedis.service"包以及包下的JedisClient.java類拷貝到taotao-sso-interface工程的src/main/java目錄下
接着把taotao-content-service工程下的src/main/java目錄下的"com.taotao.jedis.service.impl"包以及包下的兩個類複製到taotao-sso-service工程的src/main/java目錄下
下面修改applicationContext-service.xml,如下圖所示,在taotao-sso-interface工程下新建掃描包"com.taotao.sso.service",在taotao-sso-service工程下新建"com.taotao.sso.service.impl"。發佈的dubbo服務名稱修改爲"taotao-sso",dubbo服務的端口修改爲"20883"。
下面修改applicationContext-trans.xml,只需要修改切面。
下面我們拷貝taotao-content-service工程下的WEB-INF目錄及web.xml文件,修改下

下面我們再創建一個表現層工程,taotao-sso-web
修改taotao-sso-web工程的pom.xml文件
將taotao-item-web工程的src/main/resources目錄下的資源文件拷貝到taotao-sso-web工程的src/main/resources目錄下,resource目錄下的resource.properties文件我們清空它
下面修改springmvc.xml文件
最後添加web.xml文件,如下圖所示。將taotao-item-web替換爲taotao-sso-web
這樣,SSO工程便搭建完了。

單點登錄接口文檔分析及Service層接口開發併發布

在工作當中,開發文檔是我們開發人員最重要的開發指南, 對開發文檔一定要認真研讀,不可錯過任何重要信息,我們現在學單點登錄(SSO)也需要學習下開發文檔。

我們先來看文檔的第一個接口(註冊接口):檢查數據是否可用,如下圖所示。文檔中明確給出請求的類型是GET請求,URL地址也給我們規定好了,http://sso.taotao.com是域名,user/check/代表檢查用戶合法性。{param}/{type}是指要檢查的參數及類型,param是可選參數,可以分別代表username、phone、email,當param代表username時type的值傳1,當param代表phone時type的值傳2,當param代表email時type的值傳3。可選參數callback可以用於支持跨域解決js請求的問題。返回值參數都給我定好了,status代表狀態碼,msg代表返回的消息,data代表用戶所傳參數是否可用。我們最常用的TaotaoResult便剛好滿足返回值的條件。

在這裏插入圖片描述
http請求肯定是在客戶端寫的,而客戶端是需要服務端接口支撐的,現在我們便實現服務層接口開發及發佈服務。

首先來看下數據來源,我們所要檢查的用戶數據都存儲在tb_user表中,我們檢查一下用戶名、電話、郵箱是否合法,如果在用戶表中已經有了,那麼就非法,如果用戶表中沒有相同記錄,那麼就合法。由於是單表操作,因此我們使用逆向工程生成的dao層代碼即可。

我們在接口類中添加接口TaotaoResult checkUserData(String data,int type);

之後在taotao-sso-service工程中添加實現類UserServiceImpl

下面我們便發佈一下服務,如下圖所示。暴露的服務接口類<dubbo:service interface=“com.taotao.sso.service.UserService” ref=“userServiceImpl” timeout=“300000”/>
這樣Service層便寫完了。

單點登錄檢查數據是否可用—Controller層及測試

首先我們要確保taotao-sso-web工程依賴了taotao-sso-interface工程以及是否依賴了jackson相關包(用來將對象轉爲json的),查看"Maven Dependencies"下的包,如果有taotao-sso-interface以及下圖圈住的三個jackson包說明已經依賴好了。如果沒有則要添加對它的依賴。

下面我們添加對dubbo服務的引用(<dubbo:reference interface=“com.taotao.sso.service.UserService” id=“userService” />)

下面我們新建一個Controller類,

下面我們來測試一下這個接口是否好用。

在測試之前,我們要先把taotao-sso-service工程下的spring目錄下的applicationContext-Activemq.xml文件給刪除掉(當時建工程的時候我忘記刪了),否則會影響工程啓動,去掉那個文件之後,spring目錄下就只剩下四個配置文件了

先將taotao-sso工程打包到本地maven倉庫,方法就是在taotao-sso工程上右鍵------>Run As------->Maven install

下面我們便依次啓動taotao-sso-service和taotao-sso-web工程,用tomcat插件啓動工程前面多次說到了,就是在工程上右鍵------>Run As------>Maven Build,然後就會看到如下圖所示對話框,我們在Goals一欄輸入"clean tomcat7:run"然後點擊"Apply"之後再點擊"Run"這樣taotao-sso-service工程便開始啓動了,同理我們啓動taotao-sso-web工程。

啓動好之後,我們在地址欄中輸入http://localhost:8088/user/check/zhangsan/1,可惜的是,我們會看到如下圖所示的錯誤(這裏之所以沒有事先把錯誤都排查掉是爲了和大家一起學習下如何解決問題)

404錯誤是找不到對應的接口,也就是我們的訪問請求並沒有被攔截,這是由於taotao-sso-web工程的web.xml文件配置過濾條件造成的,如下圖所示,可以看到當前配置的攔截請求是以"*.html"結尾的,

那麼我們不妨在請求地址的最後加上.html結尾,如http://localhost:8088/user/check/zhangsan/1.html所示,404問題雖然沒了,但出來個406錯誤,出現406錯誤與SpringMVC框架有關,我們在請求的末尾加上.html後,SpringMVC便把請求返回的結果當做html頁面來渲染,但是我們返回的是TaotaoResult對象,它本身是無法被渲染成html的,因此就會拋出406的錯誤。可見,我們在請求的結尾加.html是不可行的。

不能在結尾加.html還有更重要的一個原因,那就是接口文檔,在接口文檔中明確給出了請求的格式,如下圖所示,可以看到並沒有以.html結尾,我們作爲開發人員不能擅自在請求後面加.html。

那麼,我們應該怎樣解決問題呢?其實也很簡單,那就是將web.xml文件的過濾條件改爲"/"

下面重啓taotao-sso-web工程,然後訪問http://localhost:8088/user/check/zhangsan/1,可以看到如下圖所示結果。data返回false說明zhangsan這個用戶名已經被別人註冊過了。

把用戶名修改爲"zhangsan11",如下圖所示,可以看到這個用戶名還沒有被註冊。

我們再測試下電話,我們在數據庫中複製一個已經註冊過的電話
我們在地址欄輸入http://localhost:8088/user/check/13333333333/2,如下圖所示。可以看到該手機號已經被註冊了。
隨便修改下手機號,然後再測試一下,如下圖所示。可以看到這個手機號沒有被註冊過。

下面我們再測試下郵箱是否合法,可以看到"aa@a"這個郵箱已經被註冊過了。
我們修改下郵箱,再試試,如下圖所示,可以看到這個郵箱沒有被註冊過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章