最近開發smain遇到的問題,因爲是前後端分離,而後端服務有多個(目前有control/oms/wms),所以不同的模塊訪問的
服務是不同的。雖然shiro和redis做了集成,session已經可以共享,但是不同的服務因爲域名不同,導致訪問不同的服務
是cookie不一樣。其實可以使用cas單點登陸解決,不過暫時不想做集成,選擇一個比較取巧的方式實現。
如下:不同的模塊訪問的後端的服務是獨立部署的
登陸成功後將sessionId 和 服務列表返回到前端
subject.login(token);
Object cookie = SecurityUtils.getSubject().getSession().getId();
Map<String,Object> results = new HashMap<String,Object>();
results.put("cookie", cookie.toString());
List<Object[]> nodes = this.createQuery("SELECT node.code,node.host FROM ServiceNode node");
results.put("nodes", nodes);
前端接受到後,分別訪問每個服務的 sso
@RequestMapping(value="/sso")
public ResponseResult login(String cookieValue, String path){
Cookie cookie = new Cookie("appKey",cookieValue);
cookie.setPath("/"+path);
response.addCookie(cookie);
return new ResponseResult();
}
如此每個域名的 cookie都保持一致了,每次請求服務 jsessionid 的值都是一樣。
如下:兩個appKey(jsessionid)是一樣的。
注意:cookie.setPath("/"+path) 這裏的path一定要和 下圖中的path保持一直。