一、HttpServletRequest 请求信息获取
1. 核心依赖与注解
- 核心依赖:
javax.servlet.http.HttpServletRequest - 控制器注解:
@RestController/@Controller + @RequestMapping - 示例映射配置:
@RequestMapping("/request")
2. 关键请求信息获取方法
| 获取维度 | 核心代码 | 说明 |
|---|---|---|
| 请求方式 | String method = request.getMethod(); | 获取HTTP请求类型(GET/POST/PUT等) |
| 完整URL | String url = request.getRequestURL().toString(); | 包含协议、IP、端口、资源路径的完整地址(例:http://localhost:8080/request) |
| 请求URI | String 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. 进阶用法
-
注解简化配置:
@ResponseStatus:方法/类上直接标注状态码(例:@ResponseStatus(HttpStatus.CREATED))@RestController:自动将返回对象序列化为JSON,无需手动处理响应体
-
全局异常处理:
-
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<String> handleIllegalArg(Exception e) { return ResponseEntity.badRequest().body(e.getMessage()); } }
-
-
高级响应场景:文件下载、异步响应、流式响应、响应压缩/缓存优化等
4. 两种响应方式对比
| 维度 | HttpServletResponse | ResponseEntity |
|---|---|---|
| 代码风格 | 命令式,手动操作流 | 声明式,链式调用 |
| 异常处理 | 需手动捕获IO异常 | Spring自动处理 |
| 功能灵活性 | 极高,可操作底层流 | 满足绝大多数业务场景 |
| 推荐场景 | 传统Servlet项目 | Spring Boot/MVC项目 |
总结
- 请求信息获取:核心通过
HttpServletRequest对象获取请求方式、URL/URI、参数、请求头等关键信息,是处理客户端请求的基础。 - 响应数据配置:Spring MVC 推荐使用
ResponseEntity替代原生HttpServletResponse,状态码(2xx/4xx/5xx)和响应头(Content-Type/Cache-Control)是配置响应的核心要素。 - 最佳实践:通过
@RestControllerAdvice统一处理异常,结合注解简化响应配置,兼顾代码简洁性和业务灵活性。