HttpServletRequest常用功能简介-笔记

发布于:2025-05-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

javax.servlet.http.HttpServletRequest 是 ServletRequest 接口的子接口,专用于处理 HTTP 协议相关的请求。它提供了访问请求行、请求头、请求参数以及请求属性等方法。

1.请求行(Request Line)

✅ 功能说明

请求行包含客户端发送的 HTTP 请求的基本信息,包括:

  • HTTP 方法:如 GETPOSTPUTDELETE
  • 请求 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"));
    }
}

⚠️ 注意事项

  1. 字符编码:对于 POST 请求,建议在 getParameter() 前,先设置 request.setCharacterEncoding("UTF-8")
  2. 文件上传:若需处理文件上传,需使用 Part 或第三方库(如 Apache Commons FileUpload)。
  3. 安全:避免直接信任客户端提交的数据,需进行验证和过滤。

网站公告

今日签到

点亮在社区的每一天
去签到