1.需求描述
有兩個(gè)后臺(tái)系統(tǒng)A黍特、B。現(xiàn)在需要A系統(tǒng)的后臺(tái)用戶坎藐,登錄A系統(tǒng)之后,能夠訪問B系統(tǒng)的公告功能
嗅榕。針對(duì)這個(gè)需求有兩種解決方案:
1>將A系統(tǒng)的所有用戶接入B系統(tǒng)中;(開發(fā)工作量大吵聪,業(yè)務(wù)邏輯復(fù)雜)凌那;
2>采用Token+Session方式,實(shí)現(xiàn)A系統(tǒng)的后臺(tái)用戶單點(diǎn)登錄
(開發(fā)工作量小吟逝,業(yè)務(wù)邏輯簡(jiǎn)單)帽蝶。
2.具體實(shí)現(xiàn)
A系統(tǒng)后臺(tái)用戶訪問,B系統(tǒng)的公告可分為以下步驟:
首先設(shè)計(jì)表ACCESS_TOKEN_SESSION
,核心表字段:token块攒、sessonId励稳。
Step1: 獲取token
A系統(tǒng)訪問時(shí),B系統(tǒng)會(huì)在在ACCESS_TOKEN_SESSION
表插入一條訪問記錄囱井。
eg:訪問鏈接 http://localhost:8080/Jaden/hz15/getToken
同時(shí)B系統(tǒng)開發(fā)IpWhiteListFilter
過濾器驹尼,只有指定請(qǐng)求IP才能獲取到B系統(tǒng)的訪問token
。
Step2: 攜帶token訪問公告功能
頁面
eg:http://localhost:8080/cams/html/notice.html?token=XXX
B系統(tǒng)開發(fā)TokenVefityFilter
過濾器庞呕,判斷token是否非空新翎、是否在數(shù)據(jù)庫已有。如果token有效住练,獲取當(dāng)前請(qǐng)求的sessionId地啰,更新到ACCESS_TOKEN_SESSION
表的對(duì)應(yīng)記錄中;否則跳轉(zhuǎn)到訪問拒絕頁面讲逛。
Step3:訪問公告功能
B系統(tǒng)開發(fā)AppNoticeReqInterceptor
攔截器亏吝,判斷URL符合/appNotice/**
請(qǐng)求,對(duì)應(yīng)的sessionId是否有效盏混。(即在ACCESS_TOKEN_SESSION
表根據(jù)當(dāng)前sessionId可以查詢到一條記錄)
只有sessionId有效蔚鸥,才能繼續(xù)訪問公告功能:列表展示惜论、新增公告等;否則跳轉(zhuǎn)到訪問拒絕頁面株茶。
Step4: Session超時(shí)處理
B系統(tǒng)自定義ASessionTimeoutListener
監(jiān)聽器:當(dāng)A系統(tǒng)生成的Session失效后来涨,根據(jù)sessionId將ACCESS_TOKEN_SESSION
表對(duì)應(yīng)記錄物理刪除
。
3.開發(fā)過程启盛,關(guān)聯(lián)基礎(chǔ)知識(shí)深入
1.Ajax重定向
默認(rèn)ajax是不支持重定向的蹦掐,因?yàn)閍jax本身就是局部刷新,不重新加載頁面的僵闯∥钥梗可以通過前后端共同更改實(shí)現(xiàn)。
2.Session監(jiān)聽器注入Spring Bean
1>因?yàn)楸O(jiān)聽器并不在Spring容器之中鳖粟,所以無法使用@Autowired注入社裆,使用ApplicationContext獲取向图;
2>在監(jiān)聽器中更改數(shù)據(jù)庫記錄泳秀,需要在事務(wù)中進(jìn)行,在方法上添加@Transactional不起作用榄攀。