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?的主要内容,如果未能解决你的问题,请参考以下文章
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