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()                 → 获取请求语言地区
相关推荐
自由鬼1 小时前
如何处理Y2K38问题
java·运维·服务器·程序人生·安全·操作系统
_oP_i4 小时前
RabbitMQ 队列配置设置 RabbitMQ 消息监听器的并发消费者数量java
java·rabbitmq·java-rabbitmq
Monkey-旭4 小时前
Android Bitmap 完全指南:从基础到高级优化
android·java·人工智能·计算机视觉·kotlin·位图·bitmap
我爱996!4 小时前
SpringMVC——响应
java·服务器·前端
小宋10215 小时前
多线程向设备发送数据
java·spring·多线程
大佐不会说日语~6 小时前
Redis高频问题全解析
java·数据库·redis
寒水馨6 小时前
Java 17 新特性解析与代码示例
java·开发语言·jdk17·新特性·java17
启山智软6 小时前
选用Java开发商城的优势
java·开发语言
鹦鹉0076 小时前
SpringMVC的基本使用
java·spring·html·jsp
R cddddd6 小时前
Maven模块化开发与设计笔记
java·maven