当前位置: 首页 > 面试题库 >

如何在Tomcat中终止所有会话?

岳风畔
2023-03-14
问题内容

我想在Tomcat中终止所有会话。我们在Fitnesse下测试我们的产品,并且仍有一些会话,会话结束导致测试之间的依赖性。我使用以下代码手动完成此操作,但仍保留一些会话(我可以使用http://
localhost:8080 / manager / html /
list

url进行检查)

public static void expireAllSessions() {
    String[] applications = { "a", "b", "c", "d",  "e" };
    for (String application : applications) {
        try {
            expireAllSessions(application);
        } catch (Exception e) {
            logger.error(e);
        }
    }
}

private static void expireAllSessions(final String application) throws Exception {
    // cf doc http://hc.apache.org/httpclient-3.x/authentication.html
    HttpClient client = new HttpClient();
    client.getParams().setAuthenticationPreemptive(true);
    Credentials userPassword = new UsernamePasswordCredentials("tomcat", "tomcat");
    client.getState().setCredentials(AuthScope.ANY, userPassword);

    String url = "http://localhost:8080/manager/html/expire";
    NameValuePair[] parametres = new NameValuePair[] {
            new NameValuePair("path", "/" + application),
            new NameValuePair("idle", "0")
    };
    HttpMethod method = new GetMethod(url);
    method.setQueryString(parametres);
    client.executeMethod(method);
}

有没有办法在没有剩余会话的情况下更有效,更快捷地执行此操作?


问题答案:

我假设您的应用程序实际上是独立的上下文。我所做的事情与您在HttpSessionListener每种情况下使用的要求类似。这里最棘手的部分是,您需要具有一个由根类加载器而不是上下文类加载器加载的Session
Collection。这是我记得的方式:

创建一个类,其中包含每个上下文的活动会话。此类 必须 位于tomcat / lib目录中,以便每个上下文均可访问。它不能是任何上下文的一部分。

public class SessionMap {

  private static Map<ServletContext, Set<HttpSession>> map =
    new HashMap<ServletContext, Set<HttpSession>>();

  private SessionMap() {
  }

  public static Map<ServletContext, Set<HttpSession>> getInstance() {
    return map;
  }

  public static void invalidate(String[] contexts) {
    synchronized (map) {
      List<String> l = Arrays.asList(contexts);     
      for (Map.Entry<ServletContext, Set<HttpSession>> e : map.entrySet()) {
        // context name without the leading slash
        String c = e.getKey().getContextPath().substring(1);
        if (l.contains(c)) {
          for (HttpSession s : e.getValue()) 
            s.invalidate();
        }
      }
    }
  }

}

为每个上下文创建一个侦听器。

public class ApplicationContextListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event) {
    ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance();
    synchronized (instance) {
      ServletContext c = event.getSession().getServletContext();
      Set<HttpSession> set = instance.get(c);
      if (c == null) {
        set = new HashSet<HttpSession>();
        instance.put(c, set);
      }
      set.add(event.getSession());
    }
  }

  public void sessionDestroyed(HttpSessionEvent event) {
    ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance();
    synchronized (map) {
      ServletContext c = event.getSession().getServletContext();
      Set<HttpSession> set = instance.get(c);
      if (c != null) {
        set.remove(event.getSession());
      }
    }
  }

}

在相应上下文的中注册每个侦听器web.xml

<listener>
  <listener-class>ApplicationContextListener</listener-class>
</listener>

然后,您可以调用以下行以使任何上下文中的所有内容均无效。

SessionMap.invalidate();

为了安全起见,我正在地图上进行同步。



 类似资料:
  • 问题内容: 我可以使用成功启动,文档中提到可以正常退出应用程序hit ctrl-c。 Maven进程确实终止了,但是Tomcat仍在运行,我仍然可以访问该网页。当我再次尝试启动spring-boot时,由于端口正在使用中,因此无法启动Tomcat。 要继续,我必须手动终止正在运行的进程。这是一个错误还是我错过了什么? 问题答案: 我仍然在Windows 7上运行的1.1.9版本上碰巧。 因此,在按

  • 要继续,我必须手动终止正在运行的进程。这是一个窃听器还是我遗漏了什么?

  • 请帮助我处理这个主线程/父线程将触发子线程。如果我们停止父线程/主线程,它还必须停止所有子线程/子线程 我想用中断做这件事,但做不到。请帮我把代码弄出来 以及如何确保所有子线程都已停止?有什么办法也可以做到这一点吗 提前谢谢! 我正在尝试这样做: 公共类ThreadTest1扩展Thread{私有静态最终记录器LOGGER=Logger.get记录器(mylogger); }

  • 问题内容: 我需要将会话保留30分钟,然后销毁它。 问题答案: 您应该自己实现会话超时。其他人提到的两个选项_session.gc_maxlifetime_和_session.cookie_lifetime_都不可靠。我将解释其原因。 第一: session.gc_maxlifetime session.gc_maxlifetime 指定秒数,此后将数据视为“垃圾”并清除。垃圾收集在会话开始期间发

  • 问题内容: 我有一个在Linux中运行的操作系统,可以通过 来启动和关闭 除了1个问题,其他都还可以。有时tomcat不会停止。 尽管我停止了它,并且在catalina.out日志中看到了正在下降的日志,但是如果我这样做,仍然可以看到该进程正在运行。 可能是什么问题呢?我该如何调试?我的感觉是,这与线程有关。 因此,以下是可疑部分: 1)我使用Log4j的LogManager来检测log4j配置是

  • 对于测试证据,我想将我写到特定目录中的所有测试工件(例如服务器调用和响应)存档。我得到了压缩目录的方法,但我没有找到合适的地方来执行它。 测试生命周期回调似乎不是正确的位置,因为@AfterAll在每个测试类之后被调用,但是存档应该在所有测试类中的所有测试终止后生成。 在阅读了诸如如何在模块中执行之前和之后分别编码一次的帖子之后?似乎没有希望在jUnit中执行调用。 我找到了一个扩展TestLau

  • 问题内容: 嗨, 我正在尝试编写一个递归函数来计算Java中字符串的长度, 我知道已经存在str.length()函数,但是问题语句想要实现一个递归函数 在C编程语言中,终止字符为“ \ 0”,我只想知道如何知道字符串是否以Java结尾 当我在测试字符串中输入“ \ n”时,我的程序运行良好。请告诉我。谢谢! 输出: 问题答案: 请记住,此代码效率很低,但是它以递归方式计算String的长度。

  • 本文向大家介绍如何终止WebWork?相关面试题,主要包含被问及如何终止WebWork?时的应答技巧和注意事项,需要的朋友参考一下 Web Worker 使用教程