From 4a43a5572e40c17a2739883be8489677449f5268 Mon Sep 17 00:00:00 2001 From: Doug Morato Date: Mon, 26 Oct 2015 18:23:27 -0400 Subject: [PATCH] Unregister JDBC drivers, Fixes #134 Upon calling the maven tomcat7:shutdown goal, a severe error message was thrown because of not unloading the JDBC drivers. Signed-off-by: Doug Morato --- .../application/WebGoatServletListener.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/webgoat-container/src/main/java/org/owasp/webgoat/application/WebGoatServletListener.java b/webgoat-container/src/main/java/org/owasp/webgoat/application/WebGoatServletListener.java index 8b770cff5..a0f6c937d 100644 --- a/webgoat-container/src/main/java/org/owasp/webgoat/application/WebGoatServletListener.java +++ b/webgoat-container/src/main/java/org/owasp/webgoat/application/WebGoatServletListener.java @@ -10,6 +10,10 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.io.IOException; import java.io.InputStream; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Enumeration; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -34,6 +38,27 @@ public class WebGoatServletListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); context.log("WebGoat is stopping"); + + // Unregister JDBC drivers in this context's ClassLoader: + // Get the webapp's ClassLoader + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + // Loop through all drivers + Enumeration drivers = DriverManager.getDrivers(); + while (drivers.hasMoreElements()) { + java.sql.Driver driver = drivers.nextElement(); + if (driver.getClass().getClassLoader() == cl) { + // This driver was registered by the webapp's ClassLoader, so deregister it: + try { + context.log("Unregister JDBC driver {}"); + DriverManager.deregisterDriver(driver); + } catch (SQLException ex) { + context.log("Error unregistering JDBC driver {}"); + } + } else { + // driver was not registered by the webapp's ClassLoader and may be in use elsewhere + context.log("Not unregistering JDBC driver {} as it does not belong to this webapp's ClassLoader"); + } + } } private void setApplicationVariables(ServletContext context) {