Автор оригинала: Pankaj Kumar.
Сегодня мы рассмотрим исключение сервлета и обработку ошибок. Некоторое время назад я написал сообщение об Обработке исключений в Java , но когда дело доходит до веб-приложения, нам нужно больше, чем обычная обработка исключений в java.
Исключение Сервлета
Если вы заметили, методы doGet() и doPost() выбрасывают javax.servlet.Исключение ServletException и Исключение IOException , давайте посмотрим, что произойдет, когда мы выбросим эти исключения из нашего приложения. Я напишу простой сервлет, который вызовет исключение ServletException.
package com.journaldev.servlet.exception;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyExceptionServlet")
public class MyExceptionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
throw new ServletException("GET method is not supported.");
}
}
Теперь, когда мы вызываем этот сервлет через браузер с помощью метода GET, мы получаем ответ, как показано на рисунке ниже.
Поскольку браузер понимает только HTML, когда наше приложение выдает исключение, контейнер сервлета обрабатывает исключение и генерирует HTML-ответ. Эта логика специфична для контейнера сервлета. Я использую tomcat и получаю эту страницу с ошибкой. Если вы будете использовать некоторые другие серверы, такие как JBoss или Glassfish, вы можете получить другой HTML-ответ с ошибкой.
Проблема с этим ответом заключается в том, что он не представляет никакой ценности для пользователя. Кроме того, он показывает пользователю наши классы приложений и сведения о сервере, которые не имеет смысла использовать, и это плохо с точки зрения безопасности.
Ошибка Сервлета
Я уверен, что вы, должно быть, видели ошибку 404, когда пытались перейти по несуществующему URL-адресу. Давайте посмотрим, как ваш контейнер сервлетов реагирует на ошибку 404. Если мы отправим запрос на неверный URL-адрес, мы получим ответ в формате HTML, как показано на рисунке ниже.
Опять же, это общий HTML-код, созданный сервером от имени нашего приложения и практически не представляющий ценности для пользователя.
Обработка исключений и ошибок Сервлетов
API сервлетов обеспечивает поддержку пользовательских сервлетов обработки исключений и ошибок, которые мы можем настроить в дескрипторе развертывания. Вся цель этих сервлетов-обработать исключение или ошибку, вызванную приложением, и отправить полезный HTML-ответ пользователю. Мы можем предоставить ссылку на домашнюю страницу приложения или некоторые сведения, чтобы сообщить пользователю, что пошло не так.
Поэтому прежде всего нам нужно создать пользовательский сервлет обработчика исключений и ошибок. У нас может быть несколько сервлетов обработки исключений и ошибок для приложения, но для простоты я создам один сервлет и буду использовать его как для исключений, так и для ошибок.
Поэтому прежде всего нам нужно создать пользовательский сервлет обработчика исключений и ошибок. У нас может быть несколько сервлетов обработки исключений и ошибок для приложения, но для простоты я создам один сервлет и буду использовать его как для исключений, так и для ошибок.
package com.journaldev.servlet.exception;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}
private void processError(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// Analyze the servlet exception
Throwable throwable = (Throwable) request
.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
String servletName = (String) request
.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null) {
servletName = "Unknown";
}
String requestUri = (String) request
.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null) {
requestUri = "Unknown";
}
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.write("Exception/Error Details ");
if(statusCode != 500){
out.write("Error Details
");
out.write("Status Code:"+statusCode+"
");
out.write("Requested URI:"+requestUri);
}else{
out.write("Exception Details
");
out.write("- Servlet Name:"+servletName+" "); out.write("
- Exception Name:"+throwable.getClass().getName()+" "); out.write("
- Requested URI:"+requestUri+" "); out.write("
- Exception Message:"+throwable.getMessage()+" "); out.write("
"); out.write("Home Page"); out.write(""); } }
Давайте посмотрим, как мы можем настроить его в дескрипторе развертывания, а затем разберемся в его реализации и в том, как он работает.
ServletExceptionHandling index.html 404 /AppExceptionHandler javax.servlet.ServletException /AppExceptionHandler
Как вы можете видеть, очень легко указать сервлеты обработчика исключений для приложения, используя элемент страница ошибок . Каждый элемент страницы с ошибкой должен иметь либо код ошибки , либо тип исключения элемент. Мы определяем сервлет обработчика исключений в элементе location .
Основываясь на приведенной выше конфигурации, если приложение выдает ошибку 404 или исключение ServletException, оно будет обработано сервлетом AppExceptionHandler.
При появлении такого сценария исключения и ошибки контейнер сервлета вызовет соответствующий HTTP-метод сервлета Обработчика исключений и передаст объект запроса и ответа. Обратите внимание, что я предоставил реализацию методов doGet() и doPost (), чтобы он мог обрабатывать запросы GET и POST и использовать общий метод для их обработки.
Прежде чем контейнер сервлета вызовет сервлет для обработки исключения, он устанавливает некоторые атрибуты в запросе, чтобы получить полезную информацию об исключении, некоторые из них: javax.servlet.error.exception , javax.servlet.error.status_code , javax.servlet.error.servlet_name и javax.servlet.error.request_uri .
Для исключения код состояния всегда равен 500, что соответствует “Внутренней ошибке сервера”, для других типов ошибок мы получаем разные коды ошибок, такие как 404, 403 и т.д.
Используя код состояния, наша реализация представляет пользователю различные типы HTML-ответов. Он также предоставляет гиперссылку на домашнюю страницу приложения.
Теперь, когда мы нажмем на наш сервлет, который выдает исключение ServletException, мы получим ответ, как показано на рисунке ниже.
Если мы попытаемся получить доступ к недопустимому URL-адресу, который приведет к ответу 404, мы получим ответ, как показано на рисунке ниже.
Разве это не выглядит хорошо и помогает пользователю легко понять, что произошло, и предоставляет им способ добраться до нужного места. Это также позволяет избежать отправки пользователю конфиденциальной информации приложения. У нас всегда должны быть обработчики исключений для нашего веб-приложения.
Если вы хотите обрабатывать исключения во время выполнения и все другие исключения в одном обработчике исключений, вы можете указать тип исключения как допустимый.
java.lang.Throwable /AppExceptionHandler
Если есть несколько записей на странице ошибок, скажем, одна для Throwable и одна для IOException, и приложение создает исключение FileNotFoundException, то оно будет обработано обработчиком ошибок IOException.
Вы также можете использовать страницу JSP в качестве обработчика исключений, просто укажите местоположение файла jsp, а не сопоставление сервлетов.
Это все для обработки исключений сервлетов в веб-приложении, надеюсь, вам понравилось.
Ознакомьтесь с другими статьями этой серии:
- Веб-приложение Java
- Учебник по сервлетам Java
- Управление сеансами на Java
- Фильтр Сервлетов
- Прослушиватели Сервлетов
- Файлы cookie в сервлетах
- Пример загрузки и загрузки файла сервлета