2013-04-03 2 views
1

У меня есть веб-приложение java, которое имеет очень строгие требования безопасности. при запуске он пытается настроить веб-контейнер, чтобы заставить его использовать идентификатор сеанса SSL, чтобы установить идентификатор сеанса http. Если в этой конфигурации это не удается, я хочу, чтобы приложение остановилось и не обработало запрос. Я могу использовать System.exit(), как я делаю в примере ниже, но мне интересно, есть ли хороший способ сделать это, не убивая JVM. Кроме того, менеджер безопасности может получить в пути System.exit()Как остановить выполнение Servlet WebApp из ContextListener?

Я использую 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) 

в сервлет, поскольку некоторые веб-контейнеры могут использовать диспетчер безопасности, чтобы ваш веб-сервер не мог убить весь сервер.

Спецификация сервлета не является строгой о том, что происходит, когда вы бросаете исключение во время выполнения в контексте инициализированной функции. По моему опыту контейнеры сервлетов прерывают запуск webapp, но опять же это может зависеть от вашего контейнера, поэтому вы должны его протестировать. Если вы используете простые старые сервлеты, возможно, это хороший выбор для создания ServletFilter, который проверяет, соответствуют ли ограничения безопасности или перенаправляет запрос на страницу с ошибкой.

1

Не могли бы вы объяснить больше о том, «хотите, чтобы приложение остановилось и не обработало запрос». Вы имеете в виду свое веб-приложение или веб-контейнер. Вы хотите показать какое-то человекообразное сообщение в веб-приложении, когда есть какая-то проблема в контейнер для пользователя ?.Когда есть исключение, tomcat не запускается start.You нужно запустить его снова.

+0

только мое веб-приложение, у меня нет никаких запросов, направленных на веб-приложение вообще, поскольку внешний мир идет, приложение не должно отвечать на любые запросы, контейнер должен возвращать 404. – ams

+0

Используете ли вы какую-либо фреймворк «В весеннем каркасе он обрабатывается по умолчанию, показывая 404 при возникновении ошибки при запуске. См. Это http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html –

+0

Приложение все еще начинается, и весна не знает о других слушателях контекста и ошибках, которые они могут бросить, поэтому он просто счастливо движется вперед. – ams