Java Servlet HTTP 标头
最后修改于 2023 年 8 月 24 日
在本文中,我们将讨论 HTTP 标头,并展示如何在 Java servlet 和 JSP 文件中显示 HTTP 标头。
HTTP 标头字段是超文本传输协议 (HTTP) 中请求和响应消息标头部分中的组件。它们定义了 HTTP 事务的操作参数。
HTTP 标头允许客户端和服务器在请求或响应中传递额外信息。它们用于各种任务,例如身份验证、Cookie、缓存、连接管理或内容协商。
例如,User-Agent
指定了用户代理(发出请求的客户端应用程序,例如浏览器),而 Date
指定了消息生成的日期和时间。
标头有几种类型
- 通用标头 - 适用于请求和响应,但与正文中最终传输的数据无关。
- 请求标头 - 包含有关要获取的资源或有关客户端本身的信息。
- 响应标头 - 包含有关响应的额外信息,例如其位置或有关服务器本身的信息(名称和版本等)。
- 实体标头 - 包含有关实体正文的更多信息,例如其内容长度或 MIME 类型。
使用 Java Servlet 显示标头字段
在第一个示例中,我们在 servlet 中显示 HTTP 标头。
├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ └── MyServlet.java │ ├── resources │ └── webapp │ ├── showHeaders.jsp │ └── WEB-INF └── test └── java
这是项目结构。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>HttpServletMappingEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>11.0.11</version> <configuration> <webApp> <contextPath>/app</contextPath> </webApp> </configuration> </plugin> </plugins> </build> </project>
这是 pom.xml
文件。
package com.zetcode; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; @WebServlet(name = "ShowHeaders", urlPatterns = {"/ShowHeaders"}) public class ShowHeaders extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 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 文件发回。
PrintWriter out = response.getWriter()
我们直接写入 PrintWriter
。请注意,虽然可以进行这种直接写入,但现代 Java Web 应用程序使用 Thymeleaf、FreeMarker 或 JSP 等模板来创建 HTML 页面。
response.setContentType("text/html");
响应的内容类型设置为 text/html
。
Enumeration<String> headerNames = request.getHeaderNames();
我们使用 getHeaderNames
方法获取标头名称。它返回一个字符串枚举。
String headerName = headerNames.nextElement();
我们使用 nextElement
方法从枚举中获取下一个标头名称。
String headerValue = request.getHeader(headerName);
使用 getHeader
,我们获取标头值。
导航到 localhost:8080/app/ShowHeaders
以通过 servlet 获取标头。
在 JSP 文件中显示标头字段
在第二个示例中,我们在 JSP 文件中显示 HTTP 标头。我们还使用 JSTL 库。
<%@ 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
隐式对象,它是一个包含标头名称及其值的映射。
<c:forEach var="nextHeader" items="${header}"> <li><c:out value="${nextHeader.key}" /> = <c:out value="${nextHeader.value}" /></li> </c:forEach>
使用 JSTL 的 forEach
标签,我们遍历映射并显示标头名称及其值。
导航到 localhost:8080/app/showHeaders.jsp
以通过 JSP 获取标头。
在本文中,我们处理了 HTTP 标头字段。