Loading...

请求对象与响应对象

2026-03-22
0
-
- 分钟
|

请求对象与响应对象

Tomcat 请求响应

Web 服务器 ** 收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象request和response对象。即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了

HttpServletRequest基本功能

HttpServletRequest在 JavaWeb 中非常重要的一个类。它是Servlet的service()方法的参数之一request的功能可以分为以下几种:

  • 封装了请求头数据;

封装时,通常需要包含以下关键字段:

  • Content-Type: 告知服务器发送的数据类型。
    - `application/json`: 发送 JSON 格式数据(最常用)。
    - `application/x-www-form-urlencoded`: 传统的表单提交。
    - `multipart/form-data`: 用于文件上传。
    
    • Authorization: 身份验证凭证。

      • 常用格式:Bearer <token>Basic <credentials>
      • User-Agent: 声明发出请求的终端信息(浏览器版本、系统等),常用于反爬虫绕过。
      • Accept: 告知服务器客户端能接收的内容类型(如 application/json, text/plain)。
      • Custom Headers: 自定义头信息,例如 X-Request-Id 用于链路追踪。
      • 封装了请求正文数据,如果是GET请求,那么就没有正文;
格式类型 对应 Content-Type 应用场景
JSON 对象 application/json 最主流 :前后端分离项目,传输结构化数据。
表单数据 application/x-www-form-urlencoded 传统的 HTML 表单提交,数据格式为 key1=val1&key2=val2 。
多部分表单 multipart/form-data 文件上传 :支持混合传输文本字段和二进制文件。
纯文本/XML text/plain 或 application/xml 特定遗留系统或特殊的 API 配置。
二进制流 application/octet-stream 单个文件的原始二进制传输。
- request是一个域对象,可以把它当成Map来添加获取数据;

在 Web 架构中,request 对象不仅承载了客户端发来的数据(如参数、头信息),它还是一个临时容器,允许开发者在同一个请求的处理链条中(比如从 Filter 到 Servlet,再到 JSP/模板引擎)共享数据。 - 做请求的转发(一次请求一次数据)·(重定向(两次请求,两次数据))

request获取请求头数据

所有的请求数据都是由 Tomcat 底层自动解析并封装request 对象中的。我们在 Servlet 的 service()(或 doGet/doPost)方法中可以直接调用 API 获取。

获取请求头数据 (Headers)

方法名 返回值类型 功能描述
getHeader(String name) String 获取指定名称的请求头的值。
getHeaderNames() Enumeration 获取所有请求头名称的枚举集合。

遍历所有请求头

response.setContentType("text/html;charset=utf-8");
Enumeration<String> names = request.getHeaderNames();

while(names.hasMoreElements()) {
    String name = names.nextElement();
    String value = request.getHeader(name);
    // 控制台输出
    System.out.println(name + ": " + value);
    // 响应给浏览器
    response.getWriter().println(name + ": " + value + "<br/>");
}

请求正文与基础信息

方法名 功能描述 核心注意点 / 重点
getMethod() 返回请求方法 常用于判断是 GET 、 POST 、 PUT 等。
getContentLength() 获取请求正文的字节数 GET 请求没有正文,固定返回 -1 。
getContentType() 获取请求正文的数据类型 GET 请求返回 null ;POST 默认为 application/x-www-form-urlencoded 。
getCharacterEncoding() 获取请求体编码 若未设置,默认返回 null(底层视为 ISO-8859-1 )。
setCharacterEncoding(String) 设置请求体编码 (如 “UTF-8”) 只对 POST 请求的正文有效!不能用于解决 GET 请求的 URL 乱码!
getLocale() 返回客户端支持的语言环境 java.util.Locale 对象,常用于网站的 国际化/多语言 适配。

URL 与路径解析剖析

方法名 解析对象 此例中的返回值
getScheme() 协议 http
getServerName() 主机名 localhost
getServerPort() 端口号 8080
getContextPath() 上下文路径 /hello
getServletPath() Servlet路径 /oneServlet
getRequestURI() URI 路径 /hello/oneServlet
getRequestURL() URL 路径 http://localhost:8080/hello/oneServlet
getQueryString() URL 参数 name=zhangSan

客户端网络与连接信息

方法名 功能描述 备注说明
getRemoteAddr() 返回客户端的 IP 地址 最常用,用于记录访问者 IP 或限制 IP 访问。
getRemoteHost() 返回客户端的主机名 底层实现通常仍是返回 IP 地址。
getRemotePort() 返回客户端的端口号 浏览器每次发起请求时,由操作系统 随机分配 的临时端口。

HttpServletRequest (请求对象)

请求参数的传递与获取

无论前端是通过 GET(地址栏拼接、超链接、GET表单)还是 POST(POST表单)传递参数,后端获取参数的核心 API 是完全一致的。

参数获取核心方法大全

方法名 返回类型 适用场景 / 描述
getParameter(String name) String 最常用(单值) :获取如文本框、单选按钮、隐藏域的值。
getParameterValues(String name) String[] 多值接收 :获取如复选框(同名 checkbox )的多个值。
getParameterNames() Enumeration 遍历参数名 :获取请求中所有参数的名称集合。
getParameterMap() Map 全量获取 :将所有参数名作为 Key,对应的参数值数组作为 Value 封装为 Map。

实操提醒:若指定的参数名不存在,getParameter 会返回 null;若参数存在但没填值,会返回空字符串 ""。使用前务必做好判空处理。

请求参数中文乱码解决方案

由于前后端编码不一致(通常 Tomcat 默认用 ISO-8859-1,而页面用 UTF-8),极易产生中文乱码。GET 和 POST 的处理机制完全不同。

请求类型 乱码原因 解决方案与代码示例 核心注意点
POST 请求正文(Body)编码默认不是 UTF-8 request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); 必须 在所有 getParameter 方法调用 之前 设置,否则无效!
GET 参数挂在 URL 上,不受 Body 编码控制 方案一(手动转码) : new String(name.getBytes("ISO-8859-1"), "UTF-8"); 方案二(改配置) :修改 Tomcat 的 server.xml ,在 中添加 URIEncoding="UTF-8" 避坑指南 :Tomcat 8.5 及以上版本默认已支持 URL 传递 UTF-8 中文,无需额外配置

请求转发 (Forward) 与 Request 作用域

Request 不仅能获取数据,还能作为一个临时数据容器(域对象)在服务器内部传递数据。

  • Request 作用域:生命周期极短,仅在“一次请求和响应”范围内有效
  • 请求转发(服务器端跳转):Servlet 处理完业务后,带着 Request 域中的数据,直接跳转到另一个 JSP 或 Servlet 进行渲染。

    • 特征:地址栏不会改变
    • 核心 API

    java // 1. 往域中存数据 request.setAttribute("name", "txjava"); // 2. 执行转发 (注意路径以 / 开头) request.getRequestDispatcher("/success.jsp").forward(request, response);

HttpServletResponse (响应对象)

response 用于封装服务器的处理结果,并将其发送回客户端浏览器。它的核心功能分为四大 类 ** :设置状态码、设置响应头、输出响应正文、重定向

核心 API 功能速查表

功能分类 核心方法 代码示例与说明
状态控制 setStatus(int sc) response.setStatus(200); 设置正常响应状态码。
错误跳转 sendError(int sc, String msg) response.sendError(404, "资源飞到了外太空"); 触发 Tomcat 默认错误页。
响应头设置 setHeader(String name, String value) response.setHeader("Refresh", "5; URL=http://baidu.com"); 5秒后定时刷新跳转 。
类型与编码 setContentType(String type) response.setContentType("text/html;charset=utf-8"); 最常用 :同时设置响应格式和解决输出乱码。

响应输出中文乱码处理

往浏览器输出中文字符串前,必须且仅需执行以下两步(或者直接使用 setContentType 简写):

// 告诉浏览器用 UTF-8 解析,并设置字符流的编码为 UTF-8
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("张三的测试");

请求重定向 (Redirect)

重定向是让浏览器自己“换个地址重新访问”。

  • 工作原理:服务器向浏览器发送 302 状态码和新的 URL,浏览器立刻发起第二次全新请求
  • 特征

    1. 浏览器的地址栏会发生改变
    2. 可以跳转到当前项目外的网址(如直接跳到百度)。
    3. 核心痛点:因为是两次不同的请求,所以上一次 Request 域中的数据(通过 setAttribute 存的)会全部丢失! - 核心 API

java response.sendRedirect("/param_demo/success.html");

文章目录