2014-12-01 98 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,因此它将在您的前端和后端之间创建一个会话,而不会使用用户浏览器和前端之间的当前会话。

只有当您尝试在应用程序中执行会话劫持以便能够在两个组件中获得用户会话时,这种方法才有效。