Servlet Клиентский HTTP-запрос
Когда браузер запрашивает веб-страницу, он отправляет определенную информацию на веб-сервер. Эта информация не может быть прочитана напрямую, потому что она передается как часть заголовка HTTP-запроса. Вы можете обратиться кпротоколу HTTPдля получения дополнительной информации по теме.
Ниже приведена важная информация о заголовках от браузера, которую вы можете часто использовать в веб-программировании:
| Информация о заголовках | Описание |
|---|---|
| Accept | Этот заголовок указывает типы MIME, которые браузер или другие клиенты могут обрабатывать. Значенияimage/pngилиimage/jpegявляются двумя наиболее распространенными возможными значениями. |
| Accept-Charset | Этот заголовок задаёт набор символов, который браузер может использовать для отображения информации. Например, ISO-8859-1. |
| Accept-Encoding | Этот заголовок задаёт типы кодирования, которые браузер умеет обрабатывать. Значенияgzipилиcompress— это два наиболее распространённых возможных значения. |
| Accept-Language | Этот заголовок задаёт предпочитаемый язык клиента, и в этом случае Servlet может выдавать результаты на нескольких языках. Например, en, en-us, ru и т. д. |
| Authorization | Этот заголовок используется клиентом для идентификации себя при доступе к веб-страницам, защищённым паролем. |
| Соединение | Этот заголовок указывает, может ли клиент обрабатывать постоянные HTTP-соединения. Постоянные соединения позволяют клиенту или другим браузерам извлекать несколько файлов с помощью одного запроса. ЗначениеKeep-Aliveозначает, что используется постоянное соединение. |
| Content-Length | Этот заголовок применяется только к запросам POST и указывает размер данных POST (в байтах). |
| Cookie | Этот заголовок возвращает серверу cookie, которые ранее были отправлены браузеру. |
| Host | Этот заголовок задаёт хост и порт в исходном URL. |
| If-Modified-Since | Этот заголовок указывает, что клиент хочет получить страницу только если она была изменена после указанной даты. Если новый результат недоступен, сервер отправляет код 304, обозначаяNot Modifiedзаголовок. |
| If-Unmodified-Since | Этот заголовок противоположен If-Modified-Since; он указывает, что операция успешна только когда документ старше указанной даты. |
| Referer | Этот заголовок указывает URL веб-страницы, на которой находится ссылка. Например, если вы находитесь на странице 1 и щёлкаете ссылку на страницу 2, когда браузер запрашивает страницу 2, URL страницы 1 включается в заголовок Referer. |
| User-Agent | Этот заголовок идентифицирует браузер или другой клиент, выполняющий запрос, и может возвращать разное содержимое разным типам браузеров. |
Методы чтения HTTP-заголовков
Следующие методы можно использовать в программе на сервлетах для чтения HTTP-заголовков. Эти методы доступны через объектHttpServletRequest.
| Нет. | Метод и описание |
|---|---|
| 1 | Cookie[] getCookies() Возвращает массив, содержащий все объекты Cookie, отправленные клиентом с запросом. |
| 2 | Enumeration getAttributeNames() Возвращает перечисление, содержащее имена атрибутов, доступных запросу. |
| 3 | Enumeration getHeaderNames() Возвращает перечисление, содержащее все имена заголовков, включенных в запрос. |
| 4 | Enumeration getParameterNames() Возвращает перечисление объектов String, содержащее имена параметров, включенных в запрос. |
| 5 | HttpSession getSession() Возвращает текущую сессию, связанную с запросом, или создает ее, если у запроса нет сессии. |
| 6 | HttpSession getSession(boolean create) Возвращает текущую HttpSession, связанную с запросом, или, если текущей сессии нет и create имеет значение true, возвращает новую сессию. |
| 7 | Locale getLocale() Возвращает предпочтительную локаль клиента для принятия содержимого на основе заголовка Accept-Language. |
| 8 | Object getAttribute(String name) Возвращает значение именованного атрибута как объект или возвращает null, если атрибут с данным именем не существует. |
| 9 | ServletInputStream getInputStream() Извлекает тело запроса как двоичные данные с помощью ServletInputStream. |
| 10 | String getAuthType() Возвращает имя схемы аутентификации, используемой для защиты Servlet, например "BASIC" или "SSL", или возвращает null, если JSP не защищён. |
| 11 | String getCharacterEncoding() Возвращает имя кодировки символов, используемой в теле запроса. |
| 12 | String getContentType() Возвращает MIME-тип тела запроса или возвращает null, если тип неизвестен. |
| 13 | String getContextPath() Возвращает часть URI запроса, указывающую контекст запроса. |
| 14 | String getHeader(String name) Возвращает значение указанного заголовка запроса в виде строки. |
| 15 | String getMethod() Возвращает имя HTTP-метода запроса, например GET, POST или PUT. |
| 16 | String getParameter(String name) Возвращает значение параметра запроса в виде строки или null, если параметр не существует. |
| 17 | String getPathInfo() Возвращает любую дополнительную информацию о пути, связанную с URL, который отправил клиент при выполнении запроса. |
| 18 | String getProtocol() Возвращает имя и версию протокола запроса. |
| 19 | String getQueryString() Возвращает строку запроса в URL запроса, содержащуюся после пути. |
| 20 | String getRemoteAddr() Возвращает IP-адрес (Internet Protocol) клиента, отправившего запрос. |
| 21 | String getRemoteHost() Возвращает полностью определённое имя клиента, отправившего запрос. |
| 22 | String getRemoteUser() Возвращает вошедшего в систему пользователя, выполняющего запрос, если пользователь прошёл аутентификацию, или возвращает null, если пользователь не прошёл аутентификацию. |
| 23 | String getRequestURI() Возвращает часть URL запроса от имени протокола до строки запроса в первой строке HTTP-запроса. |
| 24 | String getRequestedSessionId() Возвращает идентификатор сессии, указанный клиентом. |
| 25 | String getServletPath() Возвращает часть URL запроса, который вызвал JSP. |
| 26 | String[] getParameterValues(String name) Возвращает массив объектов String, содержащий все значения заданного параметра запроса, или null, если параметр не существует. |
| 27 | boolean isSecure() Возвращает boolean, указывающий, использует ли запрос защищённый канал, например HTTPS. |
| 28 | int getContentLength() Возвращает длину тела запроса в байтах и предоставляет входной поток, или возвращает -1, если длина неизвестна. |
| 29 | int getIntHeader(String name) Возвращает значение указанного заголовка запроса как значение типа int. |
| 30 | int getServerPort() Возвращает номер порта, принявшего этот запрос. |
| 31 | int getParameterMap() Инкапсулирует параметры в тип Map. |
Пример HTTP-заголовков запроса
В следующем примере используется методgetHeaderNames()класса HttpServletRequest для чтения информации HTTP-заголовков. Этот метод возвращает перечисление, содержащее информацию о заголовках, относящуюся к текущему HTTP-запросу.
Получив перечисление, мы можем пройти по нему стандартным способом, используя методhasMoreElements(), чтобы определить, когда остановиться, и используя методnextElement(), чтобы получить имя каждого параметра.
//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
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("/DisplayHeader")
//扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "HTTP Header 请求实例 - Example实例";
String docType =
"<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#F0F0F0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n"+
"</tr>\n");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Приведённый выше тестовый пример находится в проекте TomcatTest, а соответствующая конфигурация web.xml выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<!-- 类名 -->
<servlet-name>DisplayHeader</servlet-name>
<!-- 所在的包 -->
<servlet-class>com.example.test.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/TomcatTest/DisplayHeader</url-pattern>
</servlet-mapping>
</web-app>
Теперь вызовите указанный выше Servlet и перейдите по адресуhttp://localhost:8080/TomcatTest/DisplayHeader , что даст следующий результат:
