2015-02-23 4 views
4

У меня есть 2 приложения/проекты, развернутые на веб-сервере tomcat 7. Там контекстные пути отличаются от «project1», «project2». Когда я нажимаю URL-адреса с этим контуром, соответствующее приложение загружается и работает нормально.Как обрабатывать 404 в контексте контекста приложения

Допустимые адреса являются:

http://localhost:8080/project1

http://localhost:8080/project2

Теперь, когда я ударил любой неправильный URL с правильным именем хоста и неверный путь контекста, как /project3, это дает мне сообщение об ошибке 404 не найден и показывает странный экран пользователю.

Я хочу показать правильную страницу с правильным сообщением конечному пользователю. Как я могу это сделать на уровне веб-сервера?

+0

@Magnilex Спасибо за редактирование моего вопроса. Не могли бы вы также помочь мне? –

+0

Извините, у меня нет на это времени. Кстати, вы действительно используете стек JEE? Для этого обычно используется сервер приложений, такой как JBoss. Если нет, то вы отметили вопрос неверными тегами. – Magnilex

+0

@Magnilex Я работаю с веб-сервером (Apache Tomcat 7.0), а не с любым сервером приложений. –

ответ

1

Вы можете адаптировать файл Tomcat conf/web.xml, чтобы показать какую-либо другую страницу, чем значение по умолчанию для ошибки 404 - см. Пример here.

Экстракт:

<error-page> 
     <error-code>404</error-code> 
     <location>/NotFound.jsp</location> 
</error-page> 
+0

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

+0

@SunilSharma: Я еще раз прочитал ваш вопрос, но я бы сказал, что мой андер по-прежнему действителен - ваш tomcat пытается использовать неправильный URL-адрес и не имеет контекста для него, поэтому он создает уродливую веб-страницу 404. Поэтому для индивидуальной обработки вам необходимо адаптировать конфигурацию tomcat (упомянутый мной «web.xml») и указать на более приятную страницу ошибок. Это не имеет ничего общего с вашими развернутыми проектами, это на уровне сервера. –

+0

вы правы, он отлично работает !! теперь его время для пива !! –

1

В теории, вы должны быть в состоянии изменить web.xml веб-приложения котом по умолчанию, но в соответствии с this, что не работает на Tomcat 7.

Другой вариант - расширить стандарт ErrorReportValve. Я «позаимствовал» очень либерально из существующего ErrorReportValve кода:

public class Custom404Valve extends ErrorReportValve{ 

     public void invoke(Request request, Response response) throws IOException, ServletException { 

      if(request.getStatusCode() != 404){ 
       super.invoke(); 
       return; 
      } 
      // Perform the request 
      getNext().invoke(request, response); 

      if (response.isCommitted()) { 
       if (response.setErrorReported()) { 
        try { 
        response.flushBuffer(); 
        } catch (Throwable t) { 
        ExceptionUtils.handleThrowable(t); 
        } 
       response.getCoyoteResponse().action(ActionCode.CLOSE_NOW, null); 
       } 
      return; 
      } 

     response.setSuspended(false); 
     //this is where your code really matters 
     //everything prior are just precautions I lifted 
     //from the stock valve. 
     try { 
      response.setContentType("text/html"); 
      response.setCharacterEncoding("utf-8"); 
      String theErrorPage = loadErrorPage(); 
      Writer writer = response.getReporter(); 
      writer.write(theErrorPage); 
      response.finishResponse(); 
     } catch (Throwable tt) { 
      ExceptionUtils.handleThrowable(tt); 
     } 

     if (request.isAsyncStarted()) { 
      request.getAsyncContext().complete(); 
     } 
     } 

     protected String loadErrorPage() { 
      BufferedReader reader = null; 
      StringBuilder errorMessage = new StringBuilder(); 
       try{ 
       File file = new File("YourErrorPage.html"); 
       reader = new BufferedReader(new FileReader(file)); 

        while (reader.ready()) { 
         errorMessage.append(reader.readLine()); 
        } 
       }catch (IOException e){ 
        e.printStackTrace(); 
       }finally{ 
       try{ 
        reader.close(); 
       }catch (IOException e) { 
        e.printStackTrace(); 
       } 
       } 
      return errorMessage.toString();  
     } 
    } 

Все, что вам теперь нужно сделать, это настроить пользовательский клапан:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 

     <Valve className="com.foo.bar.Custom404Valve"/> 
    </Host> 
+0

Вы пробовали это в Tomcat 7? Я этого не сделал, но, согласно поданной ошибке в ответе BalusC вашей ссылки, она была исправлена. –

+0

Спасибо @Geziefer; Я не нашел последнего комментария к связанному сообщению (который утверждает, что он был исправлен в новой сборке TC7), и мне было непонятно, из JIRA, что оно было исправлено. Мы дадим OP подтвердить. Клапан довольно прост. Я только добавил некоторые вещи из запаса 'ErrorReportValve', потому что это требует некоторых предосторожностей, которые, как я полагаю, необходимы. Все, что действительно нужно OP, это то, что находится в последних нескольких строках – kolossus

Смежные вопросы