我有一个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)
{
}
}
答案 0 :(得分:1)
首先,我认为使用
不是一个好主意System.exit(1)
在servlet环境中,因为某些Web容器可能使用安全管理器来阻止您的webapp终止整个服务器。
servlet规范对于在contextInitialized函数中抛出运行时异常时会发生什么并不严格。根据我的经验,servlet容器会中止webapp的启动,但同样可能取决于你的容器,所以你应该测试它。 如果您使用的是普通的旧servlet,那么创建一个ServletFilter可能是个不错的选择,它可以检查安全性约束是否正常,或者将请求重定向到错误页面。
答案 1 :(得分:1)
请您详细解释“希望应用程序停止而不处理请求”。您的意思是您的Web应用程序或Web容器。当容器中存在问题时,您是否希望在Web应用程序上显示一些人类可读的消息对于用户?。当有异常时,tomcat没有开始启动。你必须重新启动它。