javax.servlet.http.HttpServletRequest 是 ServletRequest
接口的子接口,专用于处理 HTTP 协议相关的请求。它提供了访问请求行、请求头、请求参数以及请求属性等方法。
1.请求行(Request Line)
✅ 功能说明
请求行包含客户端发送的 HTTP 请求的基本信息,包括:
- HTTP 方法:如
GET
、POST
、PUT
、DELETE
- 请求 URI:如
/user/login
- 协议版本:如
HTTP/1.1
- 查询字符串:如
?username=admin
方法 | 说明 |
---|---|
getMethod() |
获取 HTTP 方法(如 GET、POST)。 |
getRequestURI() |
获取请求的 URI(如 /app/user )。 |
getRequestURL() |
获取完整的 URL(如 http://localhost:8080/app/user?name=Tom )。 |
getQueryString() |
获取查询字符串(如 name=Tom&age=25 )。 |
getProtocol() |
获取协议版本(如 HTTP/1.1 )。 |
🧩 使用场景
- 根据请求方法决定执行逻辑(如 GET 显示表单,POST 处理提交)
- 日志记录或访问统计
- 基于 URI 的路由处理
🔧 示例代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getMethod(); // 获取 HTTP 方法
String requestURI = request.getRequestURI(); // 获取请求 URI
StringBuffer requestURL = request.getRequestURL(); // 获取完整 URL
String queryString = request.getQueryString(); // 获取查询字符串
String protocol = request.getProtocol(); // 获取协议版本
System.out.println("Method: " + method);
System.out.println("Request URI: " + requestURI);
System.out.println("Request URL: " + requestURL.toString());
System.out.println("Query String: " + queryString);
System.out.println("Protocol: " + protocol);
}
2. 请求头(Request Headers)
✅ 功能说明
请求头包含客户端发送的元数据,如:
User-Agent
:客户端浏览器信息Accept
:客户端可接受的内容类型Content-Type
:请求体的格式Referer
:请求来源页面
方法 | 说明 |
---|---|
getHeader(String name) |
获取指定头字段的值。 |
getHeaders(String name) |
获取所有同名头字段的值(返回 Enumeration<String> )。 |
getHeaderNames() |
获取所有头字段名称(返回 Enumeration<String> )。 |
getContentType() |
获取 Content-Type 头字段值。 |
getContentLength() |
获取 Content-Length 头字段值(以字节为单位)。 |
🧩 使用场景
- 根据
User-Agent
判断客户端类型(手机 / PC) - 内容协商(如返回 JSON 或 HTML)
- 安全校验(如检查 Referer 防止跨站攻击)
🔧 示例代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=== Request Headers ===");
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name + ": " + value);
}
// 获取特定头信息
String userAgent = request.getHeader("User-Agent");
System.out.println("\nUser-Agent: " + userAgent);
}
3.请求参数(Request Parameters)
✅ 功能说明
请求参数是客户端提交的数据,主要来源于:
- URL 查询字符串(如
?username=admin
) - 表单数据(如
<form method="POST">
提交)
方法 | 说明 |
---|---|
getParameter(String name) |
获取单个参数值(如 username )。 |
getParameterValues(String name) |
获取多个参数值(如复选框 hobby,可以选择多个爱好 )。 |
getParameterMap() |
获取所有参数的键值对(返回 Map<String, String[]> )。 |
getParameterNames() |
获取所有参数名称(返回 Enumeration<String> )。 |
🧩 使用场景
- 表单处理(登录、注册)
- 分页、搜索、过滤等查询条件
- API 接口的参数接收
🔧 示例代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对于 POST 请求,建议在 getParameter() 前,先设置 request.setCharacterEncoding("UTF-8")
request.setCharacterEncoding("UTF-8"); // 设置编码
System.out.println("=== Request Parameters ===");
String username = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby");
System.out.println("Username: " + username);
System.out.println("Hobbies: " + Arrays.toString(hobbies));
// 遍历所有参数
Enumeration<String> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
String value = request.getParameter(name);
System.out.println(name + ": " + value);
}
}
4. 请求属性(Request Attributes)
✅ 功能说明
请求属性是服务器内部在处理请求时传递的数据,通常通过 setAttribute()
设置,通过 getAttribute()
获取。
方法 | 说明 |
---|---|
setAttribute(String name, Object value) |
设置请求属性。 |
getAttribute(String name) |
获取请求属性。 |
removeAttribute(String name) |
移除请求属性。 |
getAttributeNames() |
获取所有属性名称(返回 Enumeration<String> )。 |
🧩 使用场景
- 在多个 Servlet 或 JSP 页面之间共享数据
- 从过滤器传递数据到目标资源
- 传递业务处理结果或错误信息
🔧 示例代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置属性
request.setAttribute("message", "Hello from Servlet!");
// 获取属性
String message = (String) request.getAttribute("message");
System.out.println("Message: " + message);
// 遍历所有属性
Enumeration<String> attributeNames = request.getAttributeNames();
while (attributeNames.hasMoreElements()) {
String attrName = attributeNames.nextElement();
Object attrValue = request.getAttribute(attrName);
System.out.println(attrName + ": " + attrValue);
}
}
5. 完整示例
以下是一个综合示例,展示如何在 doGet
方法中使用上述方法:
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 请求行
System.out.println("=== Request Line ===");
System.out.println("Method: " + request.getMethod());
System.out.println("Request URI: " + request.getRequestURI());
System.out.println("Request URL: " + request.getRequestURL().toString());
System.out.println("Query String: " + request.getQueryString());
// 请求头
System.out.println("\n=== Request Headers ===");
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String header = headers.nextElement();
System.out.println(header + ": " + request.getHeader(header));
}
// 请求参数
System.out.println("\n=== Request Parameters ===");
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
System.out.println(param + ": " + request.getParameter(param));
}
// 请求属性
request.setAttribute("testAttr", "AttributeValue");
System.out.println("\n=== Request Attributes ===");
System.out.println("testAttr: " + request.getAttribute("testAttr"));
}
}
⚠️ 注意事项
- 字符编码:对于 POST 请求,建议在
getParameter()
前,先设置request.setCharacterEncoding("UTF-8")
- 文件上传:若需处理文件上传,需使用
Part
或第三方库(如 Apache Commons FileUpload)。 - 安全:避免直接信任客户端提交的数据,需进行验证和过滤。