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()                 → 获取请求语言地区
相关推荐
用户03321266636729 分钟前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧31 分钟前
ThreadLocal实现原理与应用实践
java
若水不如远方38 分钟前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
用户74936368484343 分钟前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing1 小时前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员
间彧2 小时前
Spring Boot集成Spring Security 6.x完整指南
java
xiezhr2 小时前
用户只需要知道「怎么办」,不需要知道「为什么炸了」
java·api·接口设计规范
xiezhr3 小时前
接口设计18条军规:写给那些半夜被“502”叫醒的人
java·api·restful
RainbowSea12 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea12 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程