Java 从后端访问用户会话

Java 从后端访问用户会话,java,wicket,restlet,shiro,Java,Wicket,Restlet,Shiro,我正在开发一个web应用程序,它有两个主要部分,一个是应用程序的Wicket端,另一个是应用程序的Restlet端,它们是完全解耦的。尽管代码驻留在同一个项目中,但我希望将其解耦,因此Wicket部分调用Restlet后端公开的REST服务 现在的问题是会话,在Restlet部分,有一个Shiro组件,当访问/login并提供正确的用户名和密码对时,它执行身份验证等操作 问题是,应用程序的Wicket部分会知道当前与Shiro一起登录Reslet部分的会话用户的方法是什么?如果您的Reslet服

我正在开发一个web应用程序,它有两个主要部分,一个是应用程序的Wicket端,另一个是应用程序的Restlet端,它们是完全解耦的。尽管代码驻留在同一个项目中,但我希望将其解耦,因此Wicket部分调用Restlet后端公开的REST服务

现在的问题是会话,在Restlet部分,有一个Shiro组件,当访问
/login
并提供正确的用户名和密码对时,它执行身份验证等操作


问题是,应用程序的Wicket部分会知道当前与Shiro一起登录Reslet部分的会话用户的方法是什么?

如果您的Reslet服务器部分与您的Wicket应用程序共享容器提供的相同web会话,您可以通过以下方式在Wicket中访问该会话:

((HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest()).getSession()
这将为您提供servlet api提供的javax.servlet.http.HttpSession。扩展org.apache.Wicket.protocol.http.WebSession的Wicket会话存储在此会话中的Wicket:Wicket.yourapp:session key下,以及您在Wicket外部使用的其他数据集或库

我不知道Restlet以及如何在那里传播会话,但我假设您需要在Restlet/Shiro部分中依赖servlet,它在会话中存储数据

编辑:检查Shiros会话接口javadoc:
//会话由业务层管理,并可通过其他层访问,而无需绑定到任何给定的客户端技术。这对Java系统来说是一个巨大的好处,因为到目前为止,唯一可行的会话机制是javax.servlet.http.HttpSession或有状态会话EJB,它多次不必要地将应用程序耦合到web或EJB技术上


考虑到这一点,上述建议将不起作用,但如果您将Shiro依赖项添加到Wicket部分,您应该能够轻松访问Shiros会话对象。

您将创建一个新的HttpServletRequest到Restlet后端,因此,它将在前端和后端之间创建会话,而不会在用户浏览器和前端之间使用当前会话


如果您试图在应用程序中执行会话劫持,以便能够在两个组件中获取用户会话,则这是唯一可行的方法。

您的restlet端和wicket部分是否在同一个Web服务器上?您可以通过调用来访问Servlet组件:
((HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest()).getSession()
Yes它在同一服务器中。实际上是同一个项目,但是Restlet的REST服务器部分是一个JAR依赖项(我正在尝试的一种解耦模式)