Skip to content

Request 与 Response 核心 API 及转发与重定向对比

本文全面梳理 HttpServletRequest 和 HttpServletResponse 的核心方法、表单参数提取、中文乱码解决方案,以及面试高频考点:请求转发与重定向的深度区别。

1. HttpServletRequest 核心 API

HttpServletRequest 代表客户端发起的 HTTP 请求。每当客户端访问服务器时,Tomcat 都会将 HTTP 请求报文封包为 request 对象。

1.1 参数获取 API(表单与 URL)

java
// 1. 获取单个参数(文本框、密码框、单选框)
String username = request.getParameter("username");

// 2. 获取多个同名参数(复选框 checkbox)
String[] hobbies = request.getParameterValues("hobby");

// 3. 获取所有参数的 Map 集合(常用于 BeanUtils 自动封装)
Map<String, String[]> parameterMap = request.getParameterMap();

1.2 中文乱码处理

  • POST 提交乱码:在读取任何参数之前,调用编码设置方法:
    java
    request.setCharacterEncoding("UTF-8");
  • GET 提交乱码(Servlet 3.0 或旧版本 Tomcat):
    java
    String name = new String(rawName.getBytes("ISO-8859-1"), "UTF-8");

1.3 常用路径与客户端信息获取 API

假设访问地址为:http://localhost:8080/my-app/user/login?id=100

方法名返回值 / 示例说明
getContextPath()/my-app获取 Web 应用的项目虚拟路径(最常用)
getServletPath()/user/login获取当前 Servlet 映射路径
getQueryString()id=100获取问号后的纯参数字符串
getRequestURI()/my-app/user/login获取 URI(项目路径 + Servlet 路径)
getRequestURL()http://localhost:8080/my-app/user/login获取完整 URL(不含参数部分)
getHeader("User-Agent")浏览器内核信息获取指定的请求头信息

2. HttpServletResponse 核心 API

HttpServletResponse 代表服务器对客户端的 HTTP 响应,用以向浏览器输出数据或设置响应头。

2.1 响应输出与解决乱码

java
// 必须在调用 getWriter() 之前设置!
// 同时设置服务器响应缓冲区的编码与浏览器打开的编码格式:
response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();
out.print("<h1>登录成功!</h1>");

2.2 核心响应头控制

java
// 1. 3秒后自动定时跳转到百度
response.setHeader("Refresh", "3;url=https://www.baidu.com");

// 2. 触发浏览器弹出文件下载框
response.setHeader("Content-Disposition", "attachment;filename=report.pdf");

3. 面试高频:请求转发 vs 请求重定向

在 Servlet 中,页面或请求跳转有两种核心机制:

3.1 请求转发 (Forward)

java
// 属于服务器内部跳转:获取 RequestDispatcher 并调用 forward
request.getRequestDispatcher("/targetServlet").forward(request, response);

3.2 请求重定向 (Redirect)

java
// 属于客户端重定向:通知浏览器重新发起请求
response.sendRedirect(request.getContextPath() + "/targetServlet");

3.3 深度对比总结表

维度请求转发 (Forward)请求重定向 (Redirect)
请求次数1 次请求与 1 次响应2 次请求与 2 次响应
浏览器地址栏地址栏保持不变地址栏变为新目标的 URL
数据共享 (Request 域)可以request 域中共享存取数据不能共享 request 域中的数据
跳转范围只能在当前 Web 应用内部资源间跳转可以跳转到外部任何网址(如百度)
目标路径写法服务器端路径(不带项目名 contextPath客户端路径(必须带项目名 contextPath
执行效率效率较高(服务器内部直接转交)效率相对较低(经过浏览器二次请求)
【请求转发 Forward 图解】
浏览器 ── Request ──> [ Servlet A ──(服务器内部转交)──> Servlet B ] ── Response ──> 浏览器

【请求重定向 Redirect 图解】
浏览器 ── Request 1 ──> Servlet A ── 302 & Location ──> 浏览器 ── Request 2 ──> Servlet B ──> 浏览器

基于 VitePress 构建 | 技术知识库