Spring MVC 请求与响应全解析

8 阅读4分钟

一、HttpServletRequest 请求信息获取

1. 核心依赖与注解

  • 核心依赖:javax.servlet.http.HttpServletRequest
  • 控制器注解:@RestController / @Controller + @RequestMapping
  • 示例映射配置:@RequestMapping("/request")

2. 关键请求信息获取方法

获取维度核心代码说明
请求方式String method = request.getMethod();获取HTTP请求类型(GET/POST/PUT等)
完整URLString url = request.getRequestURL().toString();包含协议、IP、端口、资源路径的完整地址(例:http://localhost:8080/request)
请求URIString uri = request.getRequestURI();仅资源路径部分(例:/request)
请求协议String protocol = request.getProtocol();获取HTTP协议版本(例:HTTP/1.1)
请求参数String name = request.getParameter("name");获取URL查询参数/表单提交数据,参数不存在返回null(需防空指针)
请求头String accept = request.getHeader("Accept");获取指定请求头(常用:User-Agent、Referer、Cookie等)

3. 完整代码示例

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

@RestController
public class RequestInfoController {

    @RequestMapping("/request")
    public String getRequestInfo(HttpServletRequest request) {
        // 1. 获取请求方式
        String method = request.getMethod();
        System.out.println("请求方式:" + method);

        // 2. 获取请求URL和URI
        String url = request.getRequestURL().toString();
        System.out.println("请求url地址:" + url);
        String uri = request.getRequestURI();
        System.out.println("请求uri地址:" + uri);

        // 3. 获取请求协议
        String protocol = request.getProtocol();
        System.out.println("请求协议:" + protocol);

        // 4. 获取请求参数
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println("name: " + name + ", age: " + age);

        // 5. 获取请求头
        String accept = request.getHeader("Accept");
        System.out.println("Accept: " + accept);

        return "OK";
    }
}

4. 运行示例

访问地址:http://localhost:8080/request?name=张三&age=20

控制台输出:

请求方式:GET
请求url地址:http://localhost:8080/request
请求uri地址:/request
请求协议:HTTP/1.1
name: 张三, age: 20
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8

二、HTTP 响应数据配置

1. 核心响应要素

(1)HTTP 状态码分类

状态码系列含义核心说明常见场景
1xx临时状态请求已接收,需继续处理或忽略业务开发中较少关注
2xx成功请求已被成功接收并处理200 OK(正常响应)
3xx重定向需客户端重新发起请求302 临时跳转、301 永久跳转
4xx客户端错误错误责任在客户端404 资源不存在、403 禁止访问
5xx服务器错误错误责任在服务端500 程序异常、502 网关错误

(2)核心响应头

响应头作用典型示例
Content-Type声明响应内容类型text/html、application/json
Content-Length响应内容长度(字节数)浏览器自动解析,无需手动指定
Content-Encoding响应压缩算法gzip
Cache-Control缓存控制策略max-age=300、no-cache
Set-Cookie客户端 Cookie 设置写入用户会话信息

2. 响应数据设置方式

(1)方式1:原生 HttpServletResponse(Servlet 风格)

@RequestMapping("/response")
public void response(HttpServletResponse response) throws IOException {
    // 1. 设置响应状态码
    response.setStatus(401);
    // 2. 设置自定义响应头
    response.setHeader("itheimakey", "itheimavalue");
    // 3. 设置响应体
    response.getWriter().write("<h1>Hello Response</h1>");
}

特点:需手动处理IO异常、可操作底层响应流、兼容性强,适合传统Web项目。

(2)方式2:Spring 封装 ResponseEntity(推荐)

@RequestMapping("/response")
public ResponseEntity<String> response() {
    return ResponseEntity.status(401)        // 1. 状态码
            .header("group", "itcast")      // 2. 响应头
            .body("<h1>Hello Response</h1>"); // 3. 响应体
}

特点:无需处理IO异常、链式调用可读性强、支持泛型(自动序列化JSON)。

3. 进阶用法

  1. 注解简化配置

    1. @ResponseStatus:方法/类上直接标注状态码(例:@ResponseStatus(HttpStatus.CREATED)
    2. @RestController:自动将返回对象序列化为JSON,无需手动处理响应体
  2. 全局异常处理

    1. @RestControllerAdvice
      public class GlobalExceptionHandler {
          @ExceptionHandler(IllegalArgumentException.class)
          public ResponseEntity<String> handleIllegalArg(Exception e) {
              return ResponseEntity.badRequest().body(e.getMessage());
          }
      }
      
  3. 高级响应场景:文件下载、异步响应、流式响应、响应压缩/缓存优化等

4. 两种响应方式对比

维度HttpServletResponseResponseEntity
代码风格命令式,手动操作流声明式,链式调用
异常处理需手动捕获IO异常Spring自动处理
功能灵活性极高,可操作底层流满足绝大多数业务场景
推荐场景传统Servlet项目Spring Boot/MVC项目

总结

  1. 请求信息获取:核心通过HttpServletRequest对象获取请求方式、URL/URI、参数、请求头等关键信息,是处理客户端请求的基础。
  2. 响应数据配置:Spring MVC 推荐使用ResponseEntity替代原生HttpServletResponse,状态码(2xx/4xx/5xx)和响应头(Content-Type/Cache-Control)是配置响应的核心要素。
  3. 最佳实践:通过@RestControllerAdvice统一处理异常,结合注解简化响应配置,兼顾代码简洁性和业务灵活性。