Shiro HttpSession在SessionListener中的应用?

4

我正在尝试将我的Web应用程序的会话管理(目前由Catalina / Tomcat处理)替换为Shiro本地会话管理。

这应该是一项相当容易的工作,正如Shiro网站所宣传的那样:

透明的HttpSession支持- 如果您正在使用Shiro的本机 会话,我们已经实现了HTTP Session API和Servlet 2.5 API, 因此您无需更改任何现有的Web代码即可使用Shiro。

因此,在您将本地会话管理器替换为Shiro的 DefaultWebSessionManager 之后,一切都应该顺利进行。

对于我的Web应用程序也是如此,但是对于某个javax.servlet.http.HttpSessionListener ,情况并非如此。自从使用Shiro的会话管理以来,此侦听器不再收到事件。

没关系!Shiro提供了自己的org.apache.shiro.session.SessionListener接口,可以链接到会话管理器。

但是,此接口与javax.servlet.http.HttpSessionListener 大不相同。不再传递HttpSession 对象,而是Shiro侦听器使用其自己的 org.apache.shiro.session.Session 对象传递事件。

我的现有实现当然仅适用于HttpSession 对象。我发现可以将Shiro Session 转换为 HttpSession

// HttpServletRequest currentRequest;
// ServletContext servletContext;
// Session session;
HttpSession httpSession = new ShiroHttpSession(session, currentRequest, servletContext);

然而,无法从Shiro SessionListener访问HttpServletRequest和servletContext。

有什么解决这个问题的想法吗?例如,您能回答以下两个问题之一吗?

  1. 为什么旧的javax.servlet.http.HttpSessionListener不再被调用?
  2. 在shiro SessionListener中如何将Shiro Session对象转换为HttpSession对象?
1个回答

3
为什么旧的javax.servlet.http.HttpSessionListener不再被调用?
如你所述,现在会话管理是通过Shiro而不是Servlet容器处理的。 因此,即使您注册了HttpSessionListener,Servlet容器也不会创建任何HttpSession对象,因此不使用任何HttpSessionListener回调。
如何在shiro SessionListener中将Shiro Session对象转换为HttpSession对象?
您不需要也不应该这样做。
如果您解释一下要使用HttpSession做什么,我们可能会找到替代方案。

简单来说,我旧的SessionListener中的所有代码都是针对HttpSessions编写的。如何在不必重构所有代码以使用Shiro Session对象的情况下重用此代码?这将是相当多的工作。 - Karsten Daemen
@KarstenDaemen你在使用哪些HttpSession方法?Shiro的Session也有属性设置器和获取器,但很显然这些对JSP等不可用。 - Sotirios Delimanolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接