2014-12-01 80 views
2

我正在開發一個具有兩個主要部門的Web應用程序,一個是應用程序的Wicket端和應用程序的Restlet端,這些部分相當分離。儘管代碼駐留在同一個項目中,但我想將其解耦,因此Wicket部分調用Restlet後端公開的REST服務。從後端訪問用戶會話

現在的問題是與會議,在Restlet部分,有一個Shiro組件,它執行身份驗證等。人。當訪問/login並提供正確的用戶名&密碼對時。

問題是,應用程序的Wicket部分會知道當前用Shiro在Restlet部分中登錄的會話用戶的方法是什麼?

+1

您的restlet側和wicket部分在同一個網絡服務器上嗎?通過調用:((HttpServletRequest)RequestCycle.get()。getRequest()。getContainerRequest())。getSession()' – Bravehorsie 2014-12-02 12:36:32

+0

可以訪問Servlet組件。實際上是相同的項目,但Restlet REST服務器部分是JAR依賴項(我正在嘗試執行的解耦模式) – xybrek 2014-12-02 18:23:25

回答

1

如果容器與檢票應用提供您的Restlet服務器部分股相同的網絡會話,你可以訪問它在檢票:

((HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest()).getSession() 

它給你提供的javax.servlet.http.HttpSession通過Servlet api。您的Wicket會話將延伸至org.apache.wicket.protocol.http.WebSession存儲在此會話中的wicket:wicket.yourapp:會話密鑰以及您設置的其他數據或您在Wicket之外使用的庫。

我不知道Restlet以及您如何在那裏傳播會話,但我認爲您需要依賴於Restlet/Shiro部分中的Servlet,該部分將數據存儲在會話中。

編輯:檢查Shiros會議接口的javadoc: //A Session is intended to be managed by the business tier and accessible via other tiers without being tied to any given client technology. This is a great benefit to Java systems, since until now, the only viable session mechanisms were the javax.servlet.http.HttpSession or Stateful Session EJB's, which many times unnecessarily coupled applications to web or ejb technologies

這種考慮上述建議不會工作,但它的聲音,你應該能夠很容易地訪問Shiros Session對象,如果添加四郎依賴於你的Wicket的一部分。

1

您爲Restlet後端創建了一個新的HttpServletRequest,因此它將在您的前端和後端之間創建一個會話,而不會使用用戶瀏覽器和前端之間的當前會話。

只有當您嘗試在應用程序中執行會話劫持以便能夠在兩個組件中獲得用戶會話時,這種方法纔有效。