1

我有一个 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)
    {
    }
}
4

2 回答 2

1

首先,我认为使用它不是一个好主意

System.exit(1)

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

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

于 2013-04-03T07:45:23.827 回答
1

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

于 2013-04-03T08:47:08.697 回答