- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 jsp
文件和一个 HttpSessionListener
来监视 HttpSession
破坏 Activity 。
index.jsp
<%
HttpSession s = request.getSession();
System.out.println("SID1 : " + s.getId());
s.setAttribute("Key", "Value");
s.invalidate();
%>
session 监听器
@WebListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession s = se.getSession();
System.out.println("SID2 : " + s.getId());
System.out.println(s.getAttribute("Key"));
s.invalidate();
System.out.println("Session Destroyed");
}
}
现在根据上面的情况,向index.jsp
发送一个HTTP请求应该创建一个HttpSession
并调用它的invalidate()
方法,同时 HttpSessionListener
应该捕获相同的 HttpSession
并再次调用 invalidate()
,这个过程应该一遍又一遍地重复。
这最终会导致抛出一个 java.lang.StackOverflowError
。但是我得到了以下输出没有任何错误。
SID1 : A2751AE9E782A17380415B0078C9ED90
SID2 : A2751AE9E782A17380415B0078C9ED90
Value
Session Destroyed
我已经用 GlassFish 和 Tomcat 服务器对其进行了测试,结果保持不变。谁能解释一下这是怎么回事?
最佳答案
显然,这是因为当您从 public void sessionDestroyed(HttpSessionEvent se) {...}
第二次调用 invalidate
方法时, session 已经失效。
Session.beginInvalidate()
在这种情况下返回 false
值并且不会调用此 block :
boolean result = beginInvalidate();
try {
//if the session was not already invalid, or in process of being invalidated, do invalidate
if (result) {
//tell id mgr to remove session from all contexts
_handler.getSessionIdManager().invalidateAll(_sessionData.getId());
}
}
特别是,_handler.getSessionIdManager().invalidateAll
调用 SessionHandler.invalidate
,后者调用 SessionHandler.removeSession
,后者调用 _sessionListeners .get(i).sessionDestroyed(event);
.
因此,如果 session 已经失效,则此方案不起作用。
关于java - 为什么在 HttpSessionListener 中调用 invalidate() 不会给出 StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791302/
我面临着similar problem并了解到我的监听器类将在读取 web.xml 时实例化。我在监听器类中有几个函数供主 servlet 的 doPost 使用(它与数据库(mysql)交互以读取/
关于在我的 tomcat web 小程序中使用这些 session 监听器,我有一个非常基本的问题。我对它们的运作方式缺乏基本的了解。他们一直在运作吗?他们能否以某种方式检测用户何时注销,而无需明确单
我最近开始使用 JBossTM 以便在多个数据库连接上使用 JTA,这非常成功。如果我尝试从任何 Controller 执行事务,它可以正常工作。 但是,我最近开始尝试从 HttpSessionLis
我已经实现了 HttpSessionListiner,但它不起作用。用调试器检查它——进入 servlet 后创建新 session ,登录后 JSESSION_ID 发生变化,但 session.g
问题:此注入(inject)的依赖项将始终从 SimpleController 返回 0 为什么在尝试对 HttpSessionListener 实现进行依赖注入(inject)时此 bean 的上下
我正在尝试在 Java servlet 中跟踪有效的用户 ID,我可以通过这种方式实现 HttpSessionListener 吗? public class my_Servlet extends H
更新。我使用了其他的方法,即拥有一个私有(private)静态 int 总计。我在 sessionCreated() 上增加总数,并在 sessionDestroyed() 上减少 sessionCo
Tomcat 没有用于访问 Activity session 集合的 API,因此我想为我的 WebApp 设计一个 HttpSessionListener,但我对实现有一些顾虑。 如果我的监听器有一
我正在编写一个允许人们协作的 Web 应用程序。我希望我的一些服务仅限于协作(涉及几个人)而不是任何单独的 http session 。我创建了一个自定义的 Scope 来存储 bean。为了管理 b
我想在 session 即将到期时提醒用户。我不想使用 Ajax 或 JavaScript。那么如何在 HttpSessionListener 实现类的 sessionDestroyed() 方法中获
我有一个非常简单的 Servlet 和一个非常简单的 HttpSessionListener: @WebServlet("/HelloWorld") public class HelloWorld e
我一直在 tomcat 中尝试一些操作,突然我的所有 JSP 和 Servlet 都出现了状态代码 404。我收到了这个错误: 11-Jun-2018 17:40:57.528 SEVERE [mai
我在我的项目中创建了一个HttpSessionListener。在此监听器中,我在 session 中设置了如下内容: public void sessionCreated(HttpSessionE
问题:此注入(inject)的依赖项将始终从 SimpleController 返回 0 为什么在尝试将依赖项注入(inject)到 HttpSessionListener 实现中时,该 Bean 的
我已经在我的 web.xml 中注册了一个 HttpSessionListener 并且它工作正常,但是我需要从其他区域(例如 Servlet)访问对象实例,并且不希望使用旧的 public stat
我正在使用 HttpSessionListener 的 sessionDestroyed() 方法来获取当前 session 对象,但这是不可能的,因为在执行 sessionDestroyed() 之
我想从 HttpSessionListener.sessionCreated() 中获取用户名。当我说用户名时,我特指 HttpServletRequest.getRemoteUser() 返回的名称
我正在尝试使用带有代理 servlet 的嵌入式 jetty 实现 HttpSessionListener 接口(interface),我已经注册了 SessionListener,但它根本没有被调用
我有这样一种情况,我需要在创建 session 时创建一个 cookie,而当 session 被删除时,我必须删除该 cookie。当用户手动结束 session 时,我可以在注销 servlet
我正在尝试部署我没有编写的 war ,但我在日志中收到此错误: java.lang.NoClassDefFoundError: HttpSessionListener 我知道 HttpSessionL
我是一名优秀的程序员,十分优秀!