SessionListener 中的 Shiro HttpSession?

Posted

技术标签:

【中文标题】SessionListener 中的 Shiro HttpSession?【英文标题】:Shiro HttpSession in SessionListener? 【发布时间】:2014-02-06 14:12:54 【问题描述】:

我正在尝试将我的 webapp 的会话管理(目前由 Catalina/Tomcat 处理)替换为 shiro 本机会话管理。

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

透明的 HttpSession 支持 - 如果你使用 Shiro 的原生 会话,我们已经实现了 HTTP 会话 API 和 Servlet 2.5 API 因此您无需更改任何现有的网络代码即可使用 四郎。

所以之后,您将本地会话管理器替换为 Shiro 的 DefaultWebSessionManager,一切都应该开箱即用。

我的webapp也是这样,除了某个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。

如何解决这个问题的任何想法,例如你能回答这两个问题之一吗?

    为什么旧的javax.servlet.http.HttpSessionListener不再是 叫什么? 如何将 Shiro Session 对象转换为 HttpSession shiro 中的对象SessionListener?

【问题讨论】:

【参考方案1】:

为什么旧的javax.servlet.http.HttpSessionListener 不再是 叫什么?

正如您所解释的,会话管理现在是通过 Shiro 而不是通过 Servlet 容器来处理的。因此,即使您的 HttpSessionListener 已注册,您的 Servlet 容器也不会创建任何 HttpSession 对象,因此不会使用任何 HttpSessionListener 回调。

如何将 Shiro Session 对象转换为 HttpSession 对象 四郎SessionListener?

你不知道也不应该这样做。

如果您说明您想用HttpSession 做什么,我们或许可以找到替代方案。

【讨论】:

简单地说,我的旧 SessionListener 中的所有代码都是为与 HttpSessions 一起工作而编写的。我怎样才能重用这段代码而不必重构它来使用 Shiro Session 对象?这将是相当多的工作。 @KarstenDaemen 您使用什么HttpSession 方法? Shiro 的 Session 也有属性 setter 和 getter,但显然这些不适用于 JSP 等。

以上是关于SessionListener 中的 Shiro HttpSession?的主要内容,如果未能解决你的问题,请参考以下文章

shiro框架04会话管理+缓存管理+Ehcache使用

Chromecast API 未调用 sessionListener() 回调

JavaEE企业应用实战学习记录sessionListener

项目报错java.lang.ClassNotFoundException: org.common.SessionListener

java.lang.ClassNotFoundException: com.innosys.dtcom_server.base.SessionListener

在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener