Руководство по Servlets. HTTP коды.

В данной статье мы рассмотрим HTTP коды при работе с сервлетами.

Более подробно с HTTP можно ознакомиться в данном цикле статей. Сейчас мы просто пройдёмся по основным моментам.

HTTP запрос и HTTP ответ имеют следующий формат:

  • Строка статуса
  • Строка заголовка
  • Пустая линия
  • Тело сообщения (опционально)

Коды статусов делятся на несколько групп:

Код и описание
1 1xx: Информационное Означает, что запрос был успешно получен и идёт его обработка.
2 2xx: Успешное выполнение
Запрос был успешно получен, понят и принят.
3 3xx: Перенаправление                                      Последующие действия должны быть предприняты для выполнения запроса.
4 4xx: Ошибка на стороне клиент Запрос содержит синтаксическую ошибку, либо не корректен.
5 5xx: Ошибка на стороне сервера
Сервер не может выполнить обработать корректный запрос.

Ниже приведен список некоторых кодов и их значения:

1ХХ: Информационные

Сообщение Описание
100 Continue Только часть запроса была получена сервером, но на данный момент запрос не был отклонён. Клиент должен продолжать запрос.
101 Switching Protocols Сервер выбирает протокол.

2ХХ: Успешное выполнение

Сообщение Описание
200 OK Запрос успешен
201 Created Запрос выполнен, новый ресурс создан.
202 Accepted Запрос принят, но обработка не завершена.
203 Non-authoritative Information Информация в заголовке получена из локальной или сторонней копии, а не от оригинального сервера.
204 No Content Код статуса и заголовок переданы в ответе, но данные отсутствуют.
205 Reset Content Браузер должен очистить форму для этой транзакции для дополнительного ввода.
206 Partial Content Сервер возвращает часть данных. Используется для ответа на запрос, содержащий заголовок Content-Range.

3ХХ: Перенаправление

Сообщение Описание
300 Multiple Choices Список ссылок. Пользователь может выбрать ссылку и перейти к локации. Максимальное количество ссылок – 5.
301 Moved Permanently Запрашиваемая страница была перенесена на новую URL.
302 Found Запрашиваемая страница была временно перенесена на новую URL.
303 See Other Запрашиваемая страница может быть найдена по другой URL.
304 Not Modified Код ответа для заголовка If-Modifier-Since или If-None-Match, где URL не была изменена с крайней даты обновления.
305 Use Proxy Доступ к запрашиваемой странице должен быть запрошен через прокси, который указан в заголовке Location.
306 Unused Данный код использовался в предыдущей версии, но на данный момент он не используется, а сам код был зарезервирован.
307 Temporary Redirect Запрашиваемая страница была временно перенесена на новую URL.

4ХХ: Ошибка на стороне клиента

Сообщение Описание
400 Bad Request Сервер не понял запрос.
401 Unauthorized Запрашиваемая страница требует  имя пользователя и пароль.
402 Payment Required На данный момент клиент не может использовать данный код.
403 Forbidden Доступ к запрашиваемой странице запрещён.
404 Not Found Сервер не может найти запрашиваемую страницу.
405 Method Not Allowed Метод, указанный в запросе, является недопустимым.
406 Not Acceptable Сервер генерирует ответ, который не может быть принят клиентом.
407 Proxy Authentication Required Клиент должен авторизоваться с помощью прокси-сервера прежде чем запрос сможет быть обработан.
408 Request Timeout Запрос длился дольше, чем сервер был готов ждать.
409 Conflict Запрос не может быть завершён из-за конфликта.
410 Gone Запрашиваемая страница больше недоступна.
411 Length Required Элемент “Content-Length” не определён. Сервер не может принять запрос без данного элемента.
412 Precondition Failed Сервер признал предусловия запроса ошибочными.
413 Request Entity Too Large Сервер не примет данный запрос, так как тело запроса слишком большое.
414 Request-url Too Long Сервер не примет данный запроса, так как URL слишком большая (длинная).
415 Unsupported Media Type Сервер не примет данный запрос, так как данный тип медиа файла не поддерживается.
416 Requested Range Not Satisfiable Запрашиваемый диапазон байтов недоступен и находится за пределами диапазона.
417 Expectation Failed Ожидания, переданные в заголовке запроса не могут быть удовлетворены данным сервером.

5ХХ: Ошибка на стороне сервера

Сообщение Описание
500 Internal Server Error Запрос не выполнен. Сервер попал в непредвиденные условия.
501 Not Implemented Запрос не выполнен. Сервер не поддерживает запрашиваемый функционал.
502 Bad Gateway Запрос не выполнен. Сервер получил недоступный запрос от следующего сервера.
503 Service Unavailable Запрос не выполнен. На данный момент сервер перегружается, или не работает.
504 Gateway Timeout Соединение закрыто по времени.
505 HTTP Version Not Supported Сервер не поддерживает данную версию протокола HTTP.

Для того чтобы установить HTTP коды в нашем сервлете у нас есть несколько методов:

Метод и его описание
1 public void setStatus (int statusCode)

Данный метод позволяет нам установить любой код. Принимает целочисленное значение кода статуса в качестве аргумента.

2 public void sendRedirect(String url)

Генерирует ответ 302 с заголовком Location и ссылкой на новый документ.

3 public void sendError(int code, String message)

Отправляет ошибку с коротким сообщением, которое автоматически форматируется внутри HTML документа и отправляется клиенту.

Рассмотрим простой пример.
В качестве основы возьмём проект из данной статьи

Класс StatusCodeDemo


package net.proselyte.servletstutorial;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Simple Servlet that demonstrates sending errors using sendError method.
 *
 * @author Eugene Suleimanov
 */

public class StatusCodeDemo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(403, "Access denied!!!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Файл web.xml


<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Servlets Tutorial</display-name>

    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.SimpleServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>StatusCodeDemo</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.StatusCodeDemo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SimpleServlet</servlet-name>
        <url-pattern>/SimpleServlet</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>StatusCodeDemo</servlet-name>
        <url-pattern>/StatusCodeDemo</url-pattern>
    </servlet-mapping>
</web-app>

После этого выполним в консоли команду:


mvn tomcat7:run

После запуска сервера откроем браузер и перейдём по ссылке:


http://localhost:8088/StatusCodeDemo

В результате мы получим следующую страницу:

servletsStatusCodeDemo

На этом мы заканчиваем изучение HTTP кодов при работе с сервлетами.

В следующей статье мы рассмотрим запрос клиента.