目录

概述

请求转发

逻辑图

测试代码

总结

响应重定向

逻辑图

测试代码

总结

完!


概述

什么是请求转发和响应重定向?

        请求转发和响应重定向,是 web 应用中,间接访问项目资源的两种手段,也是 Servlet 控制页面跳转的两种手段

        请求转发:通过 HTTPServletRequest 实现

        响应重定向:通过 HttpServletResoponse 实现

        举个栗子:

                请求转发:A 找 B 借钱,B 没有,B 找到 C,让 C 直接把钱打到了 A 的账户上,A 只知道自己找到 B 借钱~

                响应重定向:A 找 B 借钱,B 没有,B 告诉 A,你去找 ,A 又找到 C,C 把钱借给了 A~

请求转发

逻辑图

客户端通过 HTTP 协议,向部署在 Tomcat 服务器上的 app 应用,发送了请求(比如访问某个 url),Tomcat 接收到请求后,会将请求报文,封装为 HttpServletRequest 对象(即图中的 request),同时 Tomcat 也会创建 HttpServletResponse 对象(即图中的 response)用于后续处理响应

Tomcat 根据 request 中的 url,匹配 app 中对应的 Servlet(图中的 ServletA),将 request 和 response 传递给 ServletA 进行处理。

在 ServletA 处理过程中,通过请求转发的机制(调用 request.getRequestDispatcher("目标路径").forward(request, response)),把当前的 request 和 response 转交给 ServletB 继续处理。(注意!!! 这一步过程中,是在服务器内部完成的,客户端完全感知不到~ 整个过程属于同一次 HTTP 请求)

ServletB 拿到 ServletA 传来的 resquest 和 response 后,执行自己的业务,最终再通过 response 组装响应报文

Tomcat 将响应报文相应给客户端~

总结:一次请求,多个 Servlet 接力处理,最后统一相依~

测试代码

代码还需要像之前,添加 Tomcat 依赖,项目组件,设置 Tomcat 依赖~ 此处省略~

package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 测试请求转发*/
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletA 执行了~");// 请求转发给 ServletB// 获得请求转发器RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 让请求转发器做出转发动作requestDispatcher.forward(req,resp);}
}
package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 测试请求转发*/
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletB 执行了~");}
}

请求转发也可以携带参数数据过去~

package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 测试请求转发*/
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletA 执行了~");String money = req.getParameter("money");System.out.println("servletA 获得参数 money = " + money);// 请求转发给 ServletB// 获得请求转发器RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 让请求转发器做出转发动作requestDispatcher.forward(req,resp);}
}
package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 测试请求转发*/
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletB 执行了~");String money = req.getParameter("money");System.out.println("servletB 获得参数 money = " + money);}
}

请求转发,除了能从 servletA 中转发到 servletB 外,还能转发到静态页面下,还能转发到 WEB-INF 下面的保护资源!!!

但是,不能直接在 forward 中跳转到项目外的完整的 URL 地址中

总结

        1. 请求转发是通过 HttpServletRequest 对象获取请求转发器实现的

        2. 请求转发是服务器内部的行为,对客户端是屏蔽的

        3. 客户端只发送了一次请求,即,客户端地址栏不变

        4. 服务端只产生了一对请求和响应对象(request 和 response),这一对请求和响应对象,会继续传递给下一个资源

        5. 因为全程只有一个 HttpServletRequest 对象,所以请求中的参数可以传递,请求域中的数据也可以传递

        6. 请求转发可以转发给其他的 Servlet 动态资源,也可以转发给一些静态资源,以实现页面跳转

        7. 请求转发可以转发给 WEB-INF 下受保护的资源

        8. 请求转发不能转发到本项目以外的其他外部资源

~~~

响应重定向

逻辑图

第一次交互:客户端 -> ServletA(触发重定向)

        1. 客户端发请求:

        客户端先发起第一次 HTTP 请求(比如访问 ServletA 的URL),Tomcat 接收到后,创建 request(请求对象,封装请求数据)和 response(响应对象,用于构建返回给客户端的内容),并将这两个对象传递给 ServletA 处理

        2. ServletA 处理 & 触发重定向

        ServletA 中编写重定向逻辑(response.sendRedirect("Servlet 的 URL"))。执行后,Tomcat 会通过 response 给客户端发送一个 3xx(如 302 )的状态码,同时在响应头中带上 Location:ServletB 的 URL,告诉客户端,让客户端去新的地址重新发送请求。

第二次交互:客户端 -> ServletB(重定向后的新请求)

        3. 客户端自动发起新请求:

        客户端(浏览器)受到 302 的响应后,自动发起第二次 HTTP 请求,目标就是 Location 里的 ServletB 的地址。此时,Tomcat 再次创建新的 request 和 response,传递给 ServletB 处理

        4. ServletB 处理 & 返回响应

        ServletB 处理业务逻辑,通过 response 构建实际的响应内容,Tomcat 将响应返回给客户端。

理解:为什么叫“重定向”

        两次独立请求:重定向涉及到 客户端发起的两次 HTTP 请求,第一次是根据输入的 URL 到 ServletA,第二次则是自动到 ServletB,两次请求的 request / response 完全独立~(数据完全不共享~)

        客户端可见跳转:因为是浏览器自动发起新请求,地址栏 URL 会变成 ServletB 的地址,用户可以直观的看到“跳转”过程。

总结:

        重定向就是”让客户端换个地址重新请求“的过程,通过 Tomcat 转发响应指令(302 + Location),由浏览器自动触发第二次请求。

        对比请求转发(一次请求,服务器内部调度),重定向更强调“客户端参与,两次请求”。

测试代码

package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/07  00:14* @description:*/
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 接收用户请求System.out.println("Servlet1 执行了");// 响应重定向 设置响应状态码为 302 同时设置 Location 响应头resp.sendRedirect("servlet2");
//        resp.sendRedirect("a.html");
//        resp.sendRedirect("/WEB-INF/b.html");
//        resp.sendRedirect("https://www.baidu.com");}
}
package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/07  00:15* @description:*/
@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("servlet2 执行了");}
}

 响应重定向,无法将参数携带过去,无法访问 WEB-INF 下的资源,但目标资源可以是外部资源完整 URL

总结

        1. 响应重定向通过 HttpServletResponse 对象的 sendRedirect 方法实现

        2. 响应重定向是服务端通过 302 响应码和路径,告诉客户端自己去找资源,是在服务端的挺行下的客户端的行为

        3. 客户端至少发送了两次请求,客户端的地址栏会发生变化

        4. 服务端产生了多对请求和响应对象(request 和 response),且请求和响应对象并不会传递给下一个资源

        5. 全程产生了多个 HttpServletRequet 对象,所以请求参数不可以传递,请求域中的数据也不可以传递

        6. 重定向可以是其他 Sevlet 动态资源,也可以是一些静态资源以实现页面跳转

        7. 重定向不可以访问 WEB-INF 中保护的资源

        8. 重定向可以到本项目外的外部资源

~~~

补充:当两种方式都能实现请求跳转的时候,我们一般优先使用响应重定向!

完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90127.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90127.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90127.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

severb

题目一 解决方法: 题目二: 解决方法: 题目三: xfs: ext: 题目四: 解决方法: fdisk中命令:n(新建) 主分区 、id、起始块都为默认、结束块为756M t…

Hbase2.6.2集群部署(最新版)

配套版本安装: Hadoop 3.4.1 Zookeeper3.9.3 Hbase2.6.2 前置安装 Linux环境下部署Zookeeper3.9.3(最新版)集群部署-CSDN博客 Linux环境下Hadoop3.4.1(最新版本)集群部署-CSDN博客 一、文件解压 cd /usr/local/soft/ tar -zxvf hbase-2.6.2-bin.tar.gz 二、修改启…

IDEA-安装IDEA开发工具

目录 一.从官网获取安装包 二.进行安装 三.首次运行IDEA 四.创建Java项目,检测是否运行成功 一.从官网获取安装包 IDEA官网https://www.jetbrains.com/idea/ IDEA是分为免费的社区版和付费的最终版的,这里强烈建议使用付费的最终版,免费社…

房屋结构安全监测系统:技术架构与应用解析

政策背景:制度驱动下的安全升级​​近年来,国家层面密集出台多项房屋安全管理政策,为智能化监测技术提供了明确的制度支撑和发展方向:专项整治要求:国务院《全国自建房安全专项整治作方案》明确提出“用3年左右时间完成…

goole chrome变更默认搜索引擎为百度

找到浏览器的设置点击设置跳转到设置页面点击此页面的 【搜索引擎】栏点击【管理搜索引擎和网站搜索】设置搜索引擎 网址格式http://www.baidu.com/s?wd%s&ie{inputEncoding}

万物智联时代启航:鸿蒙OS重塑全场景开发新生态

目录 HarmonyOS简介:分布式操作系统,开启万物智联新时代 HarmonyOS发展历程:从破局到引领 核心特性:分布式技术三支柱 应用场景:全场景覆盖的鸿蒙生态 什么选择鸿蒙开发?技术红利与市场蓝海 结语&…

LangChain4j 系统化知识学习笔记(接入模型、AiService、持久化记忆、增强RAG)

文章目录前言一、认识**LangChain4j**1.1、历史背景1.2、主要功能1.3、场景二、SpringBoot接入大模型2.1、项目基本配置 & pom引入依赖2.2、接入大模型2.2.1、**LangChain4j** 库结构2.2.2、引入LangChain4j相关依赖2.2.3、补充LangChain4j单测来验证与gpt交互2.3、整合lan…

什么是时序数据库?——原理、特点与应用

在大数据和物联网时代,数据的产生速度和数量都在飞速增长。尤其是在工业监控、金融分析、物联网等领域,数据往往以“时间序列”的形式不断产生。为了高效地存储和分析这类数据,时序数据库(Time Series Database,简称TS…

FastAPI+React19 ERP系统实战 第01期

一、基础环境 1.1 项目依赖 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系统前端 - React 19","main": "index.js","type": "module",…

【机器学习笔记 Ⅱ】1 神经网络

神经网络是一种受生物神经元启发设计的机器学习模型,能够通过多层非线性变换学习复杂的输入-输出关系。它是深度学习的基础,广泛应用于图像识别、自然语言处理、游戏AI等领域。1. 核心思想 生物类比:模仿人脑神经元的工作方式,通过…

谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅

面试现场:谢飞机的求职奇遇记 "请坐,谢先生。我看你简历上写了精通Lombok?"面试官推了推金丝眼镜。 谢飞机一愣:"啊...这个..."突然掏出手机,"您看我GitHub开源项目里用了SneakyThrows&…

一站式整合:解锁高效后端管理利器——Motia

在当今的科技世界中,企业对于后端系统的要求越来越高。无论是处理复杂的 API 请求、管理后台任务,还是集成 AI 代理,这些都需要一个强大的框架来支撑。而今天,我们要介绍的 Motia 正是这样一个现代化、统一的后端框架,…

如何将信息从 iPhone 同步到Mac(完整步骤和示意图)

如果您是 Apple 用户,您一定知道在所有设备上保持同步是多么便捷。Apple 生态系统的一大亮点就是能够在 iPhone 和 Mac 之间同步 iMessage 和短信。如果您想了解如何将信息从 iPhone 同步到 Mac,千万不要错过本教程。快速浏览一下这些方法:第…

【C++字符串变换】2022-7-20

缘由C问题-字符串变换-编程语言-CSDN问答 void 字符串变换() {string s "", t ""; char f; int x 0, g 1, l 0;cin >> s; l s.size();while (x <l){f s[x];if (f s[x 1]){g, s.erase(x, 1);}else{if (g > 1){s.erase(x, 1);t s.sub…

Web攻防-XMLXXE无回显带外SSRF元数据DTD实体OOB盲注文件拓展

知识点&#xff1a; 1、WEB攻防-XML&XXE-注入原理&分类&修复 2、WEB攻防-XML&XXE-文件读取&SSRF&实体引用 3、WEB攻防-XML&XXE-无回显&升级拓展&挖掘思路 一、演示案例-WEB攻防-XML&XXE-注入原理&分类&安全影响 详细点 XML被…

Node中Unexpected end of form 错误

文章目录Unexpected end of form 错误为什么 app.use(upload.any()) 会导致 Unexpected end of form 错误&#xff1f;1. 主要问题分析app.use(upload.any()) 的问题错误场景2. 解决方案✅ 方案 1&#xff1a;仅在需要文件上传的路由使用 Multer&#xff08;推荐&#xff09;✅…

通过Curtain 解决方案保障BIM模型安全共享—建筑业的防泄密实战

某跨海大桥项目突发数据泄露事件&#xff1a;主桥钢结构的BIM模型被外泄&#xff0c;核心参数流入竞争对手手中&#xff0c;导致项目风险评估升级。调查发现&#xff0c;泄漏源头是一名施工方的项目经理。尽管BIM系统已经能够控制哪些人可以阅读、修改、甚至下载资料的权限&…

ULVAC爱发科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射频电源

ULVAC爱发科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射频电源

暑假算法日记第三天

目标​&#xff1a;刷完灵神专题训练算法题单 阶段目标&#x1f4cc;&#xff1a;【算法题单】滑动窗口与双指针 LeetCode题目: 3439. 重新安排会议得到最多空余时间 I2134. 最少交换次数来组合所有的 1 II1297. 子串的最大出现次数2653. 滑动子数组的美丽值1888. 使二进制字符…

了解业务分析技术梗概

业务分析技术 以下基于BABOK V3框架&#xff0c;结合业务分析师&#xff08;BA&#xff09;的实际工作场景&#xff0c;系统梳理50项业务分析技术、常用工具、学习路径及文档应用指南。内容综合BABOK官方标准及行业实践&#xff0c;旨在提升BA的工作效能。 一、BABOK V3 技术体…