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()                 → 获取请求语言地区
相关推荐
oak隔壁找我10 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪14 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷16 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了18 小时前
Java 自动化部署
java·后端
ma_king18 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室18 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞1 天前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing1 天前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven971 天前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty