HttpServletRequest 作用
HttpServletRequest
接口在 Java Servlet API 中扮演着至关重要的角色,它是 Servlet 处理客户端 HTTP 请求的核心对象。 每次客户端(例如浏览器)向服务器发送一个 HTTP 请求时,Servlet 容器(例如 Tomcat)都会创建一个 HttpServletRequest
对象,并将客户端的请求数据封装在这个对象中,然后将这个对象传递给 Servlet 的 service()
方法(或者 doGet()
, doPost()
等方法)。
简单来说,HttpServletRequest
对象就是 HTTP 请求在服务器端的代表,它包含了所有与客户端请求相关的信息。 Servlet 通过 HttpServletRequest
对象可以获取到:
-
请求行信息 (Request Line):
- 请求方法 (HTTP Method): 例如 GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE 等。
getMethod()
方法获取。 - 请求 URI (Uniform Resource Identifier): 客户端请求的资源路径。
getRequestURI()
方法获取。 - 请求 URL (Uniform Resource Locator): 完整的请求地址。
getRequestURL()
方法获取。 - 协议和版本 (Protocol and Version): 例如 HTTP/1.1.
getProtocol()
方法获取。 - 查询字符串 (Query String): URL 中
?
后面的参数部分。getQueryString()
方法获取。
- 请求方法 (HTTP Method): 例如 GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE 等。
-
请求头信息 (Request Headers):
- 各种 HTTP 请求头: 例如
User-Agent
,Accept
,Accept-Encoding
,Content-Type
,Cookie
,Authorization
等。getHeader(String name)
: 获取指定名称的请求头值。getHeaders(String name)
: 获取指定名称的所有请求头值(一个请求头可以有多个值)。getHeaderNames()
: 获取所有请求头名称的枚举。getIntHeader(String name)
: 获取指定名称的请求头值,并将其转换为整数。getDateHeader(String name)
: 获取指定名称的请求头值,并将其转换为日期 (long 类型)。
- 各种 HTTP 请求头: 例如
-
请求体信息 (Request Body):
- 对于 POST, PUT, PATCH 等请求,请求体中包含了客户端发送的数据。
getInputStream()
: 获取一个ServletInputStream
对象,用于读取请求体的二进制数据。getReader()
: 获取一个BufferedReader
对象,用于读取请求体的文本数据 (需要知道请求体的字符编码)。getContentLength()
: 获取请求体的长度 (字节数)。getContentType()
: 获取请求体的 MIME 类型 (例如application/json
,application/x-www-form-urlencoded
,multipart/form-data
)。getCharacterEncoding()
: 获取请求体字符编码
- 对于 POST, PUT, PATCH 等请求,请求体中包含了客户端发送的数据。
-
请求参数 (Request Parameters):
- 请求参数是客户端发送给服务器的数据,可以是 URL 查询字符串中的参数,也可以是 POST 请求体中的表单数据。
getParameter(String name)
: 获取指定名称的请求参数值 (单个值)。getParameterValues(String name)
: 获取指定名称的所有请求参数值 (多个值,例如复选框)。getParameterNames()
: 获取所有请求参数名称的枚举。getParameterMap()
: 获取所有请求参数的Map
对象,键是参数名,值是参数值数组。
- 请求参数是客户端发送给服务器的数据,可以是 URL 查询字符串中的参数,也可以是 POST 请求体中的表单数据。
-
客户端信息 (Client Information):
- 客户端 IP 地址:
getRemoteAddr()
方法获取。 - 客户端主机名:
getRemoteHost()
方法获取。 - 客户端端口:
getRemotePort()
方法获取。 - 服务器 IP 地址:
getLocalAddr()
方法获取。 - 服务器名称:
getLocalName()
方法获取。 - 服务器端口:
getLocalPort()
方法获取。
- 客户端 IP 地址:
-
会话信息 (Session Information):
- 获取 Session 对象:
getSession()
,getSession(boolean create)
方法获取。 - 判断是否是新会话:
isRequestedSessionIdValid()
方法判断。 - 获取 Session ID:
getRequestedSessionId()
方法获取。 - Session ID 的来源:
isRequestedSessionIdFromCookie()
,isRequestedSessionIdFromURL()
方法判断。
- 获取 Session 对象:
-
Servlet 相关信息:
- 获取 Servlet 上下文 (ServletContext):
getServletContext()
方法获取。 - 获取 Servlet 路径:
getServletPath()
方法获取。 - 获取上下文路径:
getContextPath()
方法获取。 - 获取 PathInfo:
getPathInfo()
方法获取 (URL 中 Servlet 映射路径之后的部分)。
- 获取 Servlet 上下文 (ServletContext):
-
请求属性 (Request Attributes):
- 请求属性是服务器端在处理请求过程中设置的临时数据,可以在同一个请求的不同 Servlet、Filter 或 JSP 之间共享。
setAttribute(String name, Object value)
: 设置请求属性。getAttribute(String name)
: 获取请求属性。getAttributeNames()
: 获取所有请求属性名称的枚举。removeAttribute(String name)
: 移除请求属性。
- 请求属性是服务器端在处理请求过程中设置的临时数据,可以在同一个请求的不同 Servlet、Filter 或 JSP 之间共享。
-
请求分派 (Request Dispatching):
- 获取 RequestDispatcher 对象:
getRequestDispatcher(String path)
方法获取。forward(ServletRequest request, ServletResponse response)
: 将请求转发到另一个 Servlet、JSP 或 HTML 页面。include(ServletRequest request, ServletResponse response)
: 将另一个 Servlet、JSP 或 HTML 页面的内容包含到当前响应中。
- 获取 RequestDispatcher 对象:
-
其他:
getLocale()
: 获取客户端的首选语言环境。getLocales()
: 获取客户端支持的语言环境列表。getScheme()
: 获取请求的协议 (例如 “http” 或 “https”)。getServerName()
: 获取服务器主机名。getServerPort()
: 获取服务器端口号。isSecure()
: 判断请求是否通过安全通道 (例如 HTTPS) 传输。
总结 HttpServletRequest
的核心作用:
- 封装客户端的 HTTP 请求数据: 提供了一系列方法来获取请求行、请求头、请求体、请求参数、客户端信息等。
- 提供会话管理接口: 可以获取和管理 Session 对象。
- 提供请求属性机制: 允许在同一个请求的不同组件之间共享数据。
- 支持请求分派: 可以将请求转发或包含到其他资源。
- 提供访问 Servlet 上下文的接口: 可以获取到 ServletContext。
通过 HttpServletRequest
对象我们可以方便的获取到所有与客户端请求相关的信息,并根据这些信息来处理请求、生成响应。 它是 Servlet 与客户端之间沟通的桥梁。