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. |
| 306Unused | Данный код использовался в предыдущей версии, но на данный момент он не используется, а сам код был зарезервирован. |
| 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
В результате получим следующую страницу:
