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()                 → 获取请求语言地区
相关推荐
叫我阿柒啊7 分钟前
Java全栈开发面试实战:从基础到微服务的深度解析
java·jvm·微服务·vue3·springboot·全栈开发·restfulapi
cxyxiaokui00117 分钟前
检索增强生成(RAG):打破模型知识壁垒的革命性架构
java·aigc
Monly2123 分钟前
Docker:部署Java后端
java·docker·容器
是店小二呀35 分钟前
【C++】智能指针底层原理:引用计数与资源管理机制
android·java·c++
tianyuanwo42 分钟前
技术总结:AArch64架构下Jenkins Agent(RPM容器编译节点)掉线问题分析与排查
java·linux·jenkins
weixin_456588151 小时前
【java面试day19】mysql-优化
java·mysql·面试
华仔啊2 小时前
别再问了!Java里这几种场景,用抽象类就对了
java·后端
明天过后01222 小时前
PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并
java·python·pdf
tingting01192 小时前
Spring Boot 外部配置指定不生效的原因与解决
java·spring boot·后端
用户0332126663672 小时前
Java 设置 Excel 行高列宽:告别手动调整,拥抱自动化高效!
java·excel