項目中業務系統和一個cms系統要做session共用,此為個人工作中的總結,算不算SSO我也不知道,我要的是實現功能。
項目A和項目B是tomcat下兩個不同的項目,項目A是業務系統,項目B是cms系統,要實現的目標是 A登入進來 跳轉到B B擷取到A的session資訊
因為A登入後在A的struts.xml不能直接跳轉到B的頁面,所以在A裡面加了jsp頁面(在此頁面中實現跳轉到B頁面),跳轉到此頁面。
在此jsp頁裡擷取到session的資訊後通過c:redirect 加參數進行傳參,把session裡需要的資訊分別傳過去:
<c:redirect url='http://localhost:8080/項目B/XXX.html'>
<c:param name="orgName" value="<%=sessionDto.getOrgName()%>"></c:param>
<c:param name="deptName" value="<%=sessionDto.getDeptName()%>"></c:param>
<c:param name="personName" value="<%=sessionDto.getPersonName()%>"></c:param>
</c:redirect>
在B的頁面裡通過擷取url的路徑和參數得到傳過來的url字串,這裡要注意,前面傳過來的參數如果是中文 擷取到的參數會是類似%e9%9b%86%e5%9b%a2%e6%9c%ac%e9%83%a8的亂碼,
必須通過decodeURI()方法轉碼。
現在跳轉到B的頁面了,下面實現擷取A的session資訊:
首先在tomcat server.xml </Host>標籤下 配置:
<Context docBase="..\webapps\項目A" path="/A" reloadable="true" crossContext="true" />
<Context docBase="..\webapps\項目B" path="/B" reloadable="true" crossContext="true"/>
在A的登入action裡:
HttpSession session2 = request.getSession();
session2.setAttribute("sessionDto",A的session資訊);
ServletContext ContextA =session2.getServletContext();
ContextA.setAttribute("session", session2);
在B的web-inf/web.xml裡寫一個filter過濾器:
<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>com.XXX.util.sessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
用於在跳轉到B時 任何時候都能擷取到A的session。
在doFilter方法裡:
HttpSession session =request.getSession();
ServletContext Context = session.getServletContext();
ServletContext Context1= Context.getContext("/項目A");
if(Context1 !=null && !Context1.equals("")){
HttpSession session1 =(HttpSession)Context1.getAttribute("session");
request.setAttribute("sessionDto", session1.getAttribute("sessionDto"));
}
由於在B的html頁面裡要擷取到A的菜單許可權,所以在B的頁面裡通過iframe的方式調B裡面的一個jsp頁,這個jsp頁專門用來擷取菜單許可權,
<iframe height="100" width="100" id="getSessionIframe" src="http://localhost:8080/項目A/pages/login/getSession.jsp" style="display:none;"></iframe>
在B的html頁裡擷取iframe頁裡的值:
var userId=frames['getSessionIframe'].document.getElementById("userid").value;
這樣就把A的菜單許可權也擷取到了