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