如何从ContextListener暂停执行Servlet WebApp?

时间:2013-04-03 03:55:53

标签: java tomcat servlets

我有一个java Web应用程序,它具有非常严格的安全性要求。在启动时,它尝试配置Web容器以强制它使用SSL会话ID来建立http会话ID。如果在此配置中失败,我希望应用程序停止并且不处理请求。我可以在下面的示例中使用System.exit(),但我想知道是否有一种很好的方法可以在不杀死JVM的情况下执行此操作。安全管理员也可能妨碍System.exit()

我正在使用tomcat 7.

public class SessionTrackingModeListener implements ServletContextListener
{
    @Override
    public void contextInitialized(ServletContextEvent event)
    {
        try
        {
            ServletContext context = event.getServletContext();
            EnumSet<SessionTrackingMode> modes = EnumSet.of(SessionTrackingMode.SSL);
                context.setSessionTrackingModes(modes);
                    System.out.println("SSL based Session tracking enabled");
        } catch (Exception e)
        {
            System.err.println("Unable to setup SSL based session tracking");
            e.printStackTrace();
            System.exit(1);

           // Question How do I get the container to not start the app without using exit?
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent event)
    {
    }
}

2 个答案:

答案 0 :(得分:1)

首先,我认为使用

不是一个好主意
System.exit(1)

在servlet环境中,因为某些Web容器可能使用安全管理器来阻止您的webapp终止整个服务器。

servlet规范对于在contextInitialized函数中抛出运行时异常时会发生什么并不严格。根据我的经验,servlet容器会中止webapp的启动,但同样可能取决于你的容器,所以你应该测试它。 如果您使用的是普通的旧servlet,那么创建一个ServletFilter可能是个不错的选择,它可以检查安全性约束是否正常,或者将请求重定向到错误页面。

答案 1 :(得分:1)

请您详细解释“希望应用程序停止而不处理请求”。您的意思是您的Web应用程序或Web容器。当容器中存在问题时,您是否希望在Web应用程序上显示一些人类可读的消息对于用户?。当有异常时,tomcat没有开始启动。你必须重新启动它。