杰瑞科技汇

Java中getHeader()方法如何获取请求头?

Of course! The term "getHeader" in Java is most commonly associated with Servlets, where it's used to read HTTP headers from a client's request. However, similar concepts exist in other Java libraries like HTTP clients.

Java中getHeader()方法如何获取请求头?-图1
(图片来源网络,侵删)

Let's break it down into the most common use cases.


In Java Servlets (The Classic Case)

In a web application, an HttpServletRequest object represents the client's request. This object has several methods to get HTTP headers.

Key Methods in HttpServletRequest

  • getHeader(String name): Returns the value of a specified header as a String. If the header is not found, it returns null.
  • getHeaders(String name): Returns an Enumeration<String> of all values for a specified header. Some headers, like Accept-Language, can have multiple values.
  • getHeaderNames(): Returns an Enumeration<String> of all header names available in the request.
  • getIntHeader(String name), getDateHeader(String name): Convenience methods to get a header value as an int or a java.util.Date. They throw an IllegalArgumentException if the header value cannot be parsed.

Example: A Simple Servlet

Here's a complete example of a servlet that prints all the headers it receives.

HeaderPrinterServlet.java

Java中getHeader()方法如何获取请求头?-图2
(图片来源网络,侵删)
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("/headers")
public class HeaderPrinterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Set the content type
        response.setContentType("text/html;charset=UTF-8");
        // Get a PrintWriter to write the response
        try (PrintWriter out = response.getWriter()) {
            // Start building the HTML response
            out.println("<html><head><title>Request Headers</title></head><body>");
            out.println("<h1>HTTP Request Headers</h1>");
            out.println("<table border=\"1\">");
            out.println("<tr><th>Header Name</th><th>Header Value(s)</th></tr>");
            // Get all header names
            Enumeration<String> headerNames = request.getHeaderNames();
            // Iterate through each header name
            while (headerNames.hasMoreElements()) {
                String headerName = headerNames.nextElement();
                // Get the first value for the header
                String headerValue = request.getHeader(headerName);
                out.println("<tr><td><b>" + headerName + "</b></td>");
                out.println("<td>");
                // Check if there are multiple values for this header
                Enumeration<String> values = request.getHeaders(headerName);
                if (values.hasMoreElements()) {
                    // If there are multiple, print them all
                    while (values.hasMoreElements()) {
                        out.println(values.nextElement());
                        if (values.hasMoreElements()) {
                            out.println(", "); // Add a comma between values
                        }
                    }
                } else {
                    // Otherwise, just print the single value
                    out.println(headerValue);
                }
                out.println("</td></tr>");
            }
            out.println("</table>");
            out.println("</body></html>");
        }
    }
}

How to Test It:

  1. Deploy this servlet to a server (like Apache Tomcat).
  2. Open your web browser and navigate to http://localhost:8080/your-app-name/headers.
  3. You will see a table displaying all the headers sent by your browser, including common ones like Host, User-Agent, Accept, etc.

In Modern HTTP Clients (e.g., Apache HttpClient, OkHttp)

When you act as a client and make an HTTP request, you also use methods to get the response headers. The method is often still called getHeader().

Example: Using Apache HttpClient 5

Here's how you would get response headers after making a GET request.

Maven Dependency:

Java中getHeader()方法如何获取请求头?-图3
(图片来源网络,侵删)
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version>
</dependency>

Java Code:

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import java.io.IOException;
public class HttpClientHeaderExample {
    public static void main(String[] args) {
        // Use try-with-resources to ensure the client and response are closed
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("https://www.google.com");
            System.out.println("Executing request: " + request.getMethod() + " " + request.getUri());
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                // Get the status line
                System.out.println("Response status: " + response.getCode());
                // --- GETTING HEADERS ---
                System.out.println("\n--- Response Headers ---");
                // Get all headers as an array
                Header[] allHeaders = response.getHeaders();
                for (Header header : allHeaders) {
                    System.out.println(header.getName() + ": " + header.getValue());
                }
                // Get a specific header
                System.out.println("\n--- Specific Header ---");
                Header contentTypeHeader = response.getHeader("Content-Type");
                if (contentTypeHeader != null) {
                    System.out.println("Content-Type: " + contentTypeHeader.getValue());
                } else {
                    System.out.println("Content-Type header not found.");
                }
                // Read the response body (optional)
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    String responseBody = EntityUtils.toString(entity);
                    System.out.println("\n--- Response Body (first 200 chars) ---");
                    System.out.println(responseBody.substring(0, Math.min(responseBody.length(), 200)));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

In JavaMail API

When dealing with email, you use getHeader() to get headers from a MimeMessage.

Maven Dependency:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

Java Code:

import javax.mail.*;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class JavaMailHeaderExample {
    public static void main(String[] args) throws MessagingException {
        // This is a sample MimeMessage. In a real app, you'd get this from a store or folder.
        // For this example, we'll create one programmatically.
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("sender@example.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com"));
        message.setSubject("Test Email");
        message.setText("This is a test email body.");
        // --- GETTING HEADERS ---
        System.out.println("--- Email Headers ---");
        // Get all header names
        Enumeration<String> headerNames = message.getAllHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + ": " + message.getHeader(headerName));
        }
        // Get a specific header
        System.out.println("\n--- Specific Header ---");
        String subject = message.getHeader("Subject", null); // The second arg is the charset
        System.out.println("Subject: " + subject);
    }
}

Summary

Context Object Method Purpose
Servlets HttpServletRequest getHeader(String name) Read client request headers.
HTTP Client HttpResponse (e.g., HttpClient) getHeader(String name) Read server response headers.
JavaMail MimeMessage getHeader(String name) Read email message headers.

In short, getHeader is a fundamental method for reading metadata (headers) from structured messages in Java, whether that message is an HTTP request, an HTTP response, or an email. The most common usage for web developers is within Servlets.

分享:
扫描分享到社交APP
上一篇
下一篇