HttpServletRequest详细解释

一、什么是 HttpServletRequest

HttpServletRequest 是 Java EE(Jakarta EE)中定义的一个接口,用于表示来自客户端(通常是浏览器)的 HTTP 请求。

它提供了丰富的方法,允许你:

  • 获取请求头、参数、路径、方法等信息

  • 读取请求体内容(如 JSON、表单等)

  • 获取 cookie、session、IP

  • 与服务器交互时携带的上下文信息

它是 Servlet 规范 中的核心接口,Spring MVC 的 Controller方法中也常用它。


二、常见应用场景

1. 获取请求参数(如表单字段或 URL 参数)

复制代码
java 复制代码
String name = request.getParameter("name");

例如用户访问 /hello?name=Tom,你可以获取 name 参数为 "Tom"


2. 获取请求方式(GET、POST、PUT 等)

复制代码
java 复制代码
String method = request.getMethod();  // 返回 "GET"、"POST" 等

3. 获取请求路径和 URI

复制代码
java 复制代码
String uri = request.getRequestURI();      // /api/user/info
String url = request.getRequestURL().toString(); // http://localhost:8080/api/user/info
String contextPath = request.getContextPath(); // 项目部署路径,通常是 "" 或 "/app"

4. 获取请求头(Headers)

复制代码
HTTP 请求头(Request Headers)清单-CSDN博客
java 复制代码
String userAgent = request.getHeader("User-Agent");
String contentType = request.getHeader("Content-Type");

5. 获取客户端 IP 地址(常用于记录、限流、防刷)

复制代码
java 复制代码
String ip = request.getRemoteAddr();  // 原始 IP,可能是代理服务器地址

但这不是最可靠的方法,应结合 X-Forwarded-For 等请求头处理,如你上面的代码所示。


6. 获取请求体内容(例如 JSON 请求)

在 Spring 中你通常会用 @RequestBody,但原生写法可以这样:

复制代码
java 复制代码
BufferedReader reader = request.getReader();
StringBuilder body = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    body.append(line);
}
String requestBody = body.toString();

复制代码
java 复制代码
HttpSession session = request.getSession();
session.setAttribute("userId", 123);

Cookie[] cookies = request.getCookies();

8. 判断是否 Ajax 请求

复制代码
java 复制代码
String xRequestedWith = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(xRequestedWith)) {
    // 是 Ajax 请求
}

9.在 Spring MVC 中怎么用?

在 Controller 方法中,Spring 会自动注入 HttpServletRequest

复制代码
java 复制代码
@PostMapping("/login")
public ResponseEntity<?> login(HttpServletRequest request, @RequestBody LoginDto dto) {
    String ip = request.getRemoteAddr();
    // ...
}

三、 常用方法速查表

方法名 说明
getParameter(String) 获取请求参数
getHeader(String) 获取请求头
getMethod() 请求方法(GET/POST)
getRequestURI() URI 部分
getRequestURL() 完整 URL
getRemoteAddr() 客户端 IP
getInputStream() / getReader() 读取请求体
getCookies() 获取请求中的 Cookie
getSession() 获取用户 Session
getContextPath() 项目部署路径

四、 小结

java 复制代码
HttpServletRequest
├── 📌 请求参数
│   ├── getParameter(String name)
│   ├── getParameterMap()
│   ├── getParameterNames()
│   └── getParameterValues(String name)
│
├── 📄 请求方式与路径
│   ├── getMethod()                  → GET / POST / PUT ...
│   ├── getRequestURI()             → /api/user/info
│   ├── getRequestURL()             → http://example.com/api/user/info
│   ├── getContextPath()            → 应用上下文路径
│   └── getServletPath()            → 映射到 servlet 的路径
│
├── 📦 请求头 Header
│   ├── getHeader(String name)      → 获取单个请求头
│   ├── getHeaderNames()            → 获取所有请求头名
│   └── getHeaders(String name)     → 多个值的 header(如 Set-Cookie)
│
├── 📡 客户端信息
│   ├── getRemoteAddr()             → 客户端 IP(但可能是代理 IP)
│   ├── getRemoteHost()             → 主机名
│   ├── getRemotePort()             → 客户端端口
│   ├── getLocalAddr()              → 当前服务器地址
│   └── getLocalPort()              → 当前服务器端口
│
├── 📤 请求体
│   ├── getInputStream()            → 原始字节流(适合文件上传)
│   └── getReader()                 → 字符流(读取 JSON / 表单内容)
│
├── 🍪 Cookie / Session
│   ├── getCookies()                → 获取 cookie 数组
│   ├── getSession()                → 获取 Session 对象
│   └── getSession(boolean create)  → 不存在时是否创建新的 Session
│
├── 🔐 安全与认证
│   ├── getAuthType()               → 获取认证类型(如 BASIC)
│   ├── getRemoteUser()             → 获取登录用户
│   ├── isUserInRole(String role)   → 判断用户是否属于某角色
│   └── getUserPrincipal()          → 获取登录主体
│
├── 🧭 URL相关工具
│   ├── getQueryString()            → 获取 URL 中的参数部分
│   ├── getScheme()                 → http / https
│   ├── getServerName()             → 服务器名(如 localhost)
│   ├── getServerPort()             → 端口号(如 8080)
│   └── getRequestDispatcher(path)  → 请求转发
│
└── ⚙️ 其他
    ├── setAttribute(name, obj)     → 设置请求属性
    ├── getAttribute(name)          → 获取属性
    ├── removeAttribute(name)       → 移除属性
    └── getLocale()                 → 获取请求语言地区
相关推荐
树若逝花若殇3 分钟前
基于Spring AOP优雅记录请求响应日志
java·spring boot
Yyyyyy~30 分钟前
【java】数组的定义和使用
java
麻辣布丁31 分钟前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin32 分钟前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
嘟哩DuliDuli1 小时前
创作 Agent 的任务状态该如何保存
android·java·javascript
wdfk_prog1 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
Token掘金室1 小时前
JSON模式结构化输出报错
java·服务器·json
秋饼1 小时前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥1 小时前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java
shehuiyuelaiyuehao1 小时前
算法43,外观数列,模拟算法+双指针
java·算法