Bootstrap

HttpServletRequest

HttpServletRequest 类确实是一个封装了完整 HTTP 请求信息的对象,而 Spring MVC 提供了更简化的方式来自动映射请求路径、请求参数等信息到控制器方法中。你不必直接使用 HttpServletRequest 来处理大部分常见的请求内容,因为 Spring MVC 会为你自动处理大部分细节。但是在某些需要更细粒度控制的场景下,HttpServletRequest 仍然是一个有用的工具,它让你可以直接访问请求的各个方面。

HttpServletRequest 类概述

HttpServletRequest javax.servlet.http包下的一个接口,用于表示客户端发出的 HTTP 请求。在 Web 应用中,它提供了大量的方法来访问 HTTP 请求的各个组成部分,包括请求行、请求头、请求参数、请求体等。

在 Spring MVC 中,HttpServletRequest 被封装在 DispatcherServlet 中,并通过控制器方法参数注入(例如,@RequestParam@RequestBody)自动处理请求。但你也可以显式地注入 HttpServletRequest 以获取更多请求的详细信息。

HttpServletRequest 的核心功能

1. 请求行(Request Line)

请求行是 HTTP 请求的第一部分,通常包含请求方法(如 GET、POST、PUT 等)、请求的路径以及协议版本。

  • 获取请求方法(GET、POST 等):

    String method = request.getMethod(); // "GET", "POST", 等
    
  • 获取请求的 URI

    String uri = request.getRequestURI(); // 获取请求的路径部分,例如 /login
    
  • 获取请求的协议版本

    String protocol = request.getProtocol(); // 获取协议版本,例如 HTTP/1.1
    
2. 请求头(Request Headers)

HTTP 请求头包含了客户端关于请求的一些附加信息,如 Content-TypeUser-AgentAuthorization 等。你可以通过 HttpServletRequest 获取这些请求头信息。

  • 获取请求头

    String userAgent = request.getHeader("User-Agent"); // 获取 User-Agent 请求头
    String referer = request.getHeader("Referer"); // 获取 Referer 请求头
    
  • 获取所有请求头的枚举

    Enumeration<String> headerNames = request.getHeaderNames(); // 获取所有请求头的名称
    while (headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();
        String headerValue = request.getHeader(headerName);
        System.out.println(headerName + ": " + headerValue);
    }
    
  • 获取指定请求头的所有值

    Enumeration<String> userAgentValues = request.getHeaders("User-Agent");
    while (userAgentValues.hasMoreElements()) {
        System.out.println(userAgentValues.nextElement());
    }
    
3. 请求参数(Request Parameters)

HTTP 请求参数包含了通过 URL 查询字符串(GET 请求)或请求体(POST 请求)传递的数据。Spring MVC 会自动将请求参数映射到控制器方法的参数中。但如果需要手动获取这些参数,可以使用 HttpServletRequest

  • 获取单个请求参数

    String username = request.getParameter("username"); // 获取参数 "username"
    String password = request.getParameter("password"); // 获取参数 "password"
    
  • 获取所有请求参数

    Map<String, String[]> parameterMap = request.getParameterMap(); // 获取所有参数及其值
    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
        String paramName = entry.getKey();
        String[] paramValues = entry.getValue();
        System.out.println(paramName + ": " + Arrays.toString(paramValues));
    }
    
4. 请求体(Request Body)

对于 POST 请求或其他需要提交数据的请求,HTTP 请求体通常包含数据(如 JSON、XML 或表单数据)。你可以使用 HttpServletRequest 来获取请求体数据。

  • 读取请求体内容(适用于 POST 请求,特别是 JSON、XML 等内容):
    StringBuilder requestBody = new StringBuilder();
    String line;
    BufferedReader reader = request.getReader();
    while ((line = reader.readLine()) != null) {
        requestBody.append(line);
    }
    System.out.println(requestBody.toString());  // 打印请求体内容
    
5. 请求的 URL 和 URI
  • 获取完整的 URL

    StringBuffer url = request.getRequestURL();
    
  • 获取查询字符串

    String queryString = request.getQueryString(); // 获取 URL 中的查询字符串部分
    
6. 获取请求的 IP 地址和客户端信息
  • 获取客户端的 IP 地址

    String ipAddress = request.getRemoteAddr(); // 获取客户端的 IP 地址
    
  • 获取请求的协议类型(如 HTTP/1.1):

    String protocol = request.getProtocol(); // 获取协议类型
    
7. Session 管理
  • 获取 session 对象

    HttpSession session = request.getSession(); // 获取当前 session
    HttpSession sessionWithNew = request.getSession(true); // 获取新的 session
    
  • 设置 session 属性

    session.setAttribute("user", user);
    
  • 获取 session 属性

    Object user = session.getAttribute("user");
    
8. Cookie 操作
  • 获取请求中的所有 Cookie
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + "=" + cookie.getValue());
        }
    }
    

HttpServletRequest 和 Spring MVC 控制器

在 Spring MVC 控制器中,HttpServletRequest 可以通过方法参数直接注入,允许你手动处理 HTTP 请求的各个细节。Spring MVC 提供了自动映射请求参数的功能,但有时你可能需要直接访问请求的其他信息(如请求头、请求体、IP 地址等),这时就需要 HttpServletRequest

例子:在控制器中使用 HttpServletRequest
@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/login")
    public ResponseEntity<String> login(HttpServletRequest request, 
                                         @RequestParam String username, 
                                         @RequestParam String password) {
        // 手动获取请求头
        String userAgent = request.getHeader("User-Agent");

        // 获取客户端 IP 地址
        String ipAddress = request.getRemoteAddr();

        // 打印信息
        System.out.println("User-Agent: " + userAgent);
        System.out.println("Client IP: " + ipAddress);

        // 处理登录逻辑
        if ("admin".equals(username) && "1234".equals(password)) {
            return ResponseEntity.ok("Login successful");
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
        }
    }
}

总结

  • HttpServletRequest 是一个接口,它代表了 HTTP 请求的各个部分,包括请求行、请求头、请求参数、请求体等信息。
  • Spring MVC 简化了许多操作,通过注解如 @RequestParam@RequestBody 等,自动将请求参数映射到方法参数中,你不需要显式地访问 HttpServletRequest
  • HttpServletRequest 用于手动访问 HTTP 请求的详细信息,例如请求头、请求体、客户端 IP 地址等。
  • HttpServletRequest 是 Servlet API 的一部分,在 Web 应用中,所有的请求都会封装成 HttpServletRequest 对象传递给相关的处理方法。
;