# Java Servlet HTTP 标头

> 原文： [http://zetcode.com/articles/javaservlethttpheaders/](http://zetcode.com/articles/javaservlethttpheaders/)

在本教程中，我们讨论 HTTP 标头，并展示如何在 Java Servlet 和 JSP 文件中显示 HTTP 标头。

HTTP 标头字段是超文本传输​​协议（HTTP）中请求和响应消息的标头部分的组成部分。 它们定义 HTTP 事务的操作参数。

HTTP 标头允许客户端和服务器将附加信息与请求或响应一起传递。 它们用于各种任务，例如认证，cookie，缓存，连接管理或内容协商。

例如，`User-Agent`指定用户 aget（发出请求的客户端应用，例如浏览器），`Date`指定消息生成的日期和时间。

标头有几种类型：

*   常规标头 - 适用于请求和响应，但与最终在正文中传输的数据无关。
*   请求标头 - 包含有关要获取的资源或客户端本身的更多信息。
*   响应标头 - 包含有关响应的其他信息，例如响应的位置或服务器本身（名称和版本等）。
*   实体标头 - 包含有关实体主体的更多信息，例如其内容长度或 MIME 类型。

## 使用 Java Servlet 显示标头字段

在第一个示例中，我们在 servlet 中显示 HTTP 标头。

`ShowHeaders.java`

```java
package com.zetcode.web;

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(name = "ShowHeaders", urlPatterns = {"/ShowHeaders"})
public class ShowHeaders extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try (PrintWriter out = response.getWriter()) {

            response.setContentType("text/html");
            out.println("<!DOCTYPE html>");
            out.println("<html lang=\"en\">");
            out.println("<head>");
            out.println("<title>HTTP headers</title>"); 
            out.println("<body>"); 
            out.println("<p>Headers</p>");

            Enumeration<String> headerNames = request.getHeaderNames();

            out.println("<ol>");
            while (headerNames.hasMoreElements()) {
                out.print("<li>");
                String headerName = headerNames.nextElement();
                out.print(headerName + " = ");
                String headerValue = request.getHeader(headerName);
                out.print(headerValue);
                out.println("</li>");
            }
            out.println("</ol>");

            out.println("</body>");
            out.println("</html>");
        }
    }
}

```

`ShowHeaders` servlet 找出客户端发送的 HTTP 标头，并将它们发送回 HTML 文件中。

```java
PrintWriter out = response.getWriter()

```

我们直接写到`PrintWriter`。 请注意，虽然可以直接写，但现代 Java Web 应用使用 Thymeleaf，FreeMarker 或 JSP 之类的模板来创建 HTML 页面。

```java
response.setContentType("text/html");

```

响应的内容类型设置为`text/html`。

```java
Enumeration<String> headerNames = request.getHeaderNames();

```

我们使用`getHeaderNames()`方法获得标题名称。 它返回字符串的枚举。

```java
String headerName = headerNames.nextElement();

```

我们使用`nextElement()`方法从枚举中获取下一个标头名称。

```java
String headerValue = request.getHeader(headerName);

```

使用`getHeader()`，我们获得标头值。

## 在 JSP 文件中显示标头字段

在第二个示例中，我们在 JSP 文件中显示 HTTP 标头。 我们还使用 JSTL 库。

`showHeaders.jsp`

```java
<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>HTTP headers</title>
  </head>
  <body>
    <p>HTTP headers:</p>
    <ol>
      <c:forEach var="nextHeader" items="${header}">
          <li><c:out value="${nextHeader.key}" /> = <c:out value="${nextHeader.value}" /></li>
      </c:forEach>
    </ol>
  </body>
</html>

```

JSP 文件具有`header`隐式对象，该对象是标头名称及其值的映射。

```java
<c:forEach var="nextHeader" items="${header}">
    <li><c:out value="${nextHeader.key}" /> = <c:out value="${nextHeader.value}" /></li>
</c:forEach>

```

使用 JSTL 的`forEach`标记，我们遍历映射并显示标头名称及其值。

在本教程中，我们使用了 HTTP 标头字段。

您可能也对以下相关教程感兴趣： [Java `RequestDispatcher`](/java/requestdispatcher/) ， [Java servlet 复选框教程](/articles/javaservletcheckbox/)， [Java servlet 图像教程](/articles/javaservletimage/)， [Servlet FreeMarker `JdbcTemplate`教程](/articles/servletfreemarker/) ， [Spring Boot 中的服务图像文件](/articles/springbootserveimage/)， [Java 教程](/lang/java/)， [jQuery DatePicker教程](/articles/jquerydatepicker/)或 [Stripes 教程](/java/stripes/)。