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.

Нет.Метод и описание
1Cookie[] getCookies()
Возвращает массив, содержащий все объекты Cookie, отправленные клиентом с запросом.
2Enumeration getAttributeNames()
Возвращает перечисление, содержащее имена атрибутов, доступных запросу.
3Enumeration getHeaderNames()
Возвращает перечисление, содержащее все имена заголовков, включенных в запрос.
4Enumeration getParameterNames()
Возвращает перечисление объектов String, содержащее имена параметров, включенных в запрос.
5HttpSession getSession()
Возвращает текущую сессию, связанную с запросом, или создает ее, если у запроса нет сессии.
6HttpSession getSession(boolean create)
Возвращает текущую HttpSession, связанную с запросом, или, если текущей сессии нет и create имеет значение true, возвращает новую сессию.
7Locale getLocale()
Возвращает предпочтительную локаль клиента для принятия содержимого на основе заголовка Accept-Language.
8Object getAttribute(String name)
Возвращает значение именованного атрибута как объект или возвращает null, если атрибут с данным именем не существует.
9ServletInputStream getInputStream()
Извлекает тело запроса как двоичные данные с помощью ServletInputStream.
10String getAuthType()
Возвращает имя схемы аутентификации, используемой для защиты Servlet, например "BASIC" или "SSL", или возвращает null, если JSP не защищён.
11String getCharacterEncoding()
Возвращает имя кодировки символов, используемой в теле запроса.
12String getContentType()
Возвращает MIME-тип тела запроса или возвращает null, если тип неизвестен.
13String getContextPath()
Возвращает часть URI запроса, указывающую контекст запроса.
14String getHeader(String name)
Возвращает значение указанного заголовка запроса в виде строки.
15String getMethod()
Возвращает имя HTTP-метода запроса, например GET, POST или PUT.
16String getParameter(String name)
Возвращает значение параметра запроса в виде строки или null, если параметр не существует.
17String getPathInfo()
Возвращает любую дополнительную информацию о пути, связанную с URL, который отправил клиент при выполнении запроса.
18String getProtocol()
Возвращает имя и версию протокола запроса.
19String getQueryString()
Возвращает строку запроса в URL запроса, содержащуюся после пути.
20String getRemoteAddr()
Возвращает IP-адрес (Internet Protocol) клиента, отправившего запрос.
21String getRemoteHost()
Возвращает полностью определённое имя клиента, отправившего запрос.
22String getRemoteUser()
Возвращает вошедшего в систему пользователя, выполняющего запрос, если пользователь прошёл аутентификацию, или возвращает null, если пользователь не прошёл аутентификацию.
23String getRequestURI()
Возвращает часть URL запроса от имени протокола до строки запроса в первой строке HTTP-запроса.
24String getRequestedSessionId()
Возвращает идентификатор сессии, указанный клиентом.
25String getServletPath()
Возвращает часть URL запроса, который вызвал JSP.
26String[] getParameterValues(String name)
Возвращает массив объектов String, содержащий все значения заданного параметра запроса, или null, если параметр не существует.
27boolean isSecure()
Возвращает boolean, указывающий, использует ли запрос защищённый канал, например HTTPS.
28int getContentLength()
Возвращает длину тела запроса в байтах и предоставляет входной поток, или возвращает -1, если длина неизвестна.
29int getIntHeader(String name)
Возвращает значение указанного заголовка запроса как значение типа int.
30int getServerPort()
Возвращает номер порта, принявшего этот запрос.
31int 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 , что даст следующий результат:

Другие расширения