2013-04-03 85 views
1

我有一個java web應用程序,它有一個非常嚴格的安全要求。在啓動時,它會嘗試配置Web容器,強制它使用SSL會話標識來建立http會話標識。如果在此配置中失敗,我希望應用程序停止並不處理請求。我可以在下面的示例中使用System.exit(),但我想知道是否有一種很好的方法可以在不殺死JVM的情況下執行此操作。另外安全管理器可以在System.exit()如何停止從ContextListener執行Servlet WebApp?

礙事,我使用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) 
    { 
    } 
} 

回答

1

首先我認爲這是不使用

System.exit(1) 

一個好主意servlet環境,因爲某些Web容器可能使用安全管理器來阻止您的Web應用程序殺死整個服務器。

Servlet規範不嚴格,當你扔在contextInitialized功能運行時異常會發生什麼。根據我的經驗,servlet容器會中止Web應用程序的啓動,但它也可能取決於您的容器,因此您應該測試它。 如果您使用普通的舊servlet,那麼創建一個ServletFilter可能是一個很好的選擇,它會檢查安全約束是否正常或將請求重定向到錯誤頁面。

1

請您解釋一下「希望應用程序停止,而不是處理一個請求」。你的意思是你的Web應用程序或container.Do要顯示在Web應用程序中一些人類可讀的消息時,有一些問題容器給用戶?當出現異常時,tomcat不能開始啓動。你必須重新啓動它。

+0

只是我的網絡應用程序,我根本沒有針對網絡應用程序的任何請求,只要外部世界去應用程序不應該回應任何請求,容器應該返回404。 – ams

+0

您是否使用任何框架?在Spring框架中,它在默認情況下處理,當啓動出現錯誤時顯示404。參見 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html –

+0

該應用程序仍然開始,春天不知道其他上下文聽衆和他們可能拋出的錯誤,所以它只是愉快地移動。 – ams