在 Web 开发中,我们经常需要在不同页面之间跳转,比如登录成功后跳到首页、提交表单后跳到结果页面。这时,常见的两种跳转方式就是 请求转发(Request Forward)重定向(Redirect)

       虽然它们都能实现“页面跳转”,但底层原理、适用场景和实现方式都不同。

一、请求转发(Forward)

1. 定义

请求转发是服务器内部的一种操作方式,它允许服务器将客户端请求在服务器内部转发给另一个资源(如 JSP 或 Servlet)进行处理,而客户端对转发行为是“不可见”的。

简单理解:

用户发送请求 → 服务器内部转发 → 返回最终响应给用户(URL 不变)

2. 工作原理

  1. 客户端发送请求到服务器。

  2. 服务器接收请求,并在内部通过 RequestDispatcher 将请求转发给另一个资源。

  3. 转发的资源使用相同的请求对象 request 和响应对象 response

  4. 客户端看到的 URL 不会改变

3. 使用方式

// Servlet 示例
RequestDispatcher dispatcher = request.getRequestDispatcher("target.jsp");
dispatcher.forward(request, response);

4. 特点

  • 地址栏 URL 不变,对用户透明。

  • 请求作用域共享,转发后的资源可以访问原请求中的数据(如 request.setAttribute())。

  • 服务器内部操作,效率较高。

  • 不能转发到其他服务器或不同的域名。

5. 典型场景

  • 登录成功后,转发到用户首页。

  • 请求处理后将结果展示在 JSP 页面。

  • MVC 模式中,Controller 转发给 View。

6. Java示例

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username) && "123".equals(password)) {// 存储数据到 requestreq.setAttribute("user", username);// 请求转发到首页req.getRequestDispatcher("/home.jsp").forward(req, resp);} else {req.setAttribute("msg", "用户名或密码错误");req.getRequestDispatcher("/login.jsp").forward(req, resp);}}
}

二、重定向(Redirect)

1. 定义

重定向是服务器向客户端发送一个新的 URL,让浏览器再次发起请求。浏览器地址栏会发生变化。

简单理解:

用户发送请求 → 服务器返回 302 状态码和新 URL → 浏览器重新请求新 URL → 返回响应

2. 工作原理

  1. 客户端发送请求到服务器。

  2. 服务器通过 response.sendRedirect("新地址") 告诉浏览器去请求新的 URL。

  3. 浏览器收到响应后,再次发送请求到新的 URL。

  4. 客户端地址栏发生变化。

3. 使用方式

// Servlet 示例
response.sendRedirect("target.jsp");

4. 特点

  • 地址栏 URL 会改变

  • 请求作用域不共享,相当于新的请求。

  • 可以重定向到其他网站。

  • 需要客户端再次发起请求,效率略低于转发。

5. 典型场景

  • 表单提交后避免重复提交(Post/Redirect/Get 模式)。

  • 登录成功后跳转到另一个模块或不同域的页面。

  • 页面重构或网站 URL 改变时进行跳转。

6. Java示例

@WebServlet("/loginRedirect")
public class LoginRedirectServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username) && "123".equals(password)) {// 登录成功后重定向到首页resp.sendRedirect(req.getContextPath() + "/home.jsp");} else {// 带参数重定向(URL 拼接)resp.sendRedirect(req.getContextPath() + "/login.jsp?error=1");}}
}

三、请求转发与重定向的对比

特性请求转发(Forward)重定向(Redirect)
URL显示不变改变
请求对象共享不共享,新的请求
浏览器行为浏览器不感知浏览器必须发起新请求
可跨域可以
性能高(服务器内部操作)较低(客户端需再次请求)
使用场景内部资源跳转,如 MVC 转发表单防重、跨站跳转

四、与安全相关的提示

请求转发和重定向在实际开发中,需要注意一些安全问题,特别是 SQL 注入开放重定向

  1. SQL 注入

    • 转发或重定向本身不会直接导致 SQL 注入,但如果传递参数没有做安全处理,攻击者可以通过 URL 或表单注入恶意 SQL。

    • 建议:使用 PreparedStatement 或参数化查询,避免直接拼接 SQL。

  2. 开放重定向风险

    • 重定向如果直接使用用户提供的 URL,可能被攻击者利用跳转到恶意网站。

    • 建议:对重定向的 URL 做 白名单校验,不要直接使用用户输入。


五、实用小 Tips

  • 使用转发传递数据

request.setAttribute("msg", "登录成功");
request.getRequestDispatcher("home.jsp").forward(request, response);
  • 使用重定向避免重复提交

response.sendRedirect("home.jsp");
  • 避免跨站重定向漏洞

String target = request.getParameter("url");
if (target != null && target.startsWith("/app")) {response.sendRedirect(target);
} else {response.sendRedirect("/app/home.jsp");
}


六、总结

  • 请求转发:服务器内部跳转,地址栏不变,请求共享,适合内部资源处理。

  • 重定向:客户端跳转,地址栏改变,不共享请求,适合防重、跨站跳转。

  • 安全方面,注意 SQL 注入开放重定向

       掌握了请求转发与重定向的原理、使用方式及场景,你就能在 Java Web 开发中更加灵活地处理请求和页面跳转。

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

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

相关文章

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)引言常见错误尝试根本原因:从源码解析正确的解决方案总结引言 在使用 Model Context Protocol(MCP) 框架开发自定义工具服务器时,我们经常使用 …

The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络

Delay Tolerant Networks – DTNs 延迟容忍网络架构归属Delay Tolerant Networks – DTNs 延迟容忍网络应用实例例子 1:瑞典北部的萨米人 (Saami reindeer herders)例子 2:太平洋中的动物传感网络DTNs路由方式——存储&转发DTNs移动模型Random walk …

计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 图像边界扩展详解与实战在图像处理和计算机视觉中,有时需要在原始图像的四周增加边界(Padding)。这种操作在很多场景中都有应用,比如:卷积神经网络(CNN)中的图像预处理…

ansible管理变量和事实

ansible管理变量和事实与实施任务控制 在 Ansible 中,变量和事实(Facts)就像给剧本(Playbook)配备的 “信息工具箱”,让你的自动化配置管理更灵活、更智能。 变量:提前准备的 “预设信息” 变…

STM32--寄存器与标准库函数--基本定时器

目录 前言 基本定时器概念 定时时间 定时器时钟确定 倍频锁相环被正确配置为168MHz 定时器的库函数操作 代码 定时器的寄存器操作 代码 寄存器 后言 前言 使用平台:STM32F407ZET6 使用数据手册:STM32F407数据手册.pdf 使用参考手册&…

PCA 实现多向量压缩:首个主成分的深层意义

PCA 实现多向量压缩 第一个主成分(components_[0])正是数据协方差矩阵中最大特征值对应的特征向量。 ,layer_attention_vector[layer] 被赋值为 pca.components_[0],这确实是一个特征向量,具体来说是 PCA 分解得到的第一个主成分(主特征向量)。 关于它的维度: 假设 c…

网络常识-DNS如何解析

DNS(Domain Name System,域名系统)是互联网的“地址簿”,负责将人类易记的域名(如www.example.com)转换为计算机可识别的IP地址(如192.168.1.1)。其工作流程可以简单理解为“从域名到…

Java中 23 种设计模式介绍,附带示例

文章目录设计模式六大原则设计模式分类1、创建型模式(Creational Patterns)2、结构型模式(Structural Patterns)3、行为型模式(Behavioral Patterns)一、创建型模式(Creational Patterns&#x…

嵌入式开发入门——电子元器件~电磁继电器、蜂鸣器

文章目录电磁继电器定义关键参数实物蜂鸣器实物内部结构分类关键参数电磁继电器 定义 概述:电磁继电器是利用电磁感应原理职称的一种电磁开关,他能通过:低电压、低电流的电路,来控制高电压、高电流的电路。 关键参数 线圈电压…

ROS2基础

1.helloworld案例1.创建功能包(C)终端下,进入ws00_helloworld/src目录,使用如下指令创建一个C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld执行完毕&a…

Python爬虫实战:研究pygalmesh,构建Thingiverse平台三维网格数据处理系统

1. 引言 1.1 研究背景 在数字化浪潮席卷全球的当下,三维建模技术已成为连接虚拟与现实的核心纽带,广泛渗透于工程设计、地理信息系统(GIS)、虚拟现实(VR)、增强现实(AR)、医学影像等关键领域。例如,在建筑工程中,BIM(建筑信息模型)技术依赖高精度三维网格实现施工…

开发者说 | EmbodiedGen:为具身智能打造可交互3D世界生成引擎

概述 具身智能的发展离不开高质量、多样化的可交互3D仿真环境。为突破传统构建方式的瓶颈,我们提出了EmbodiedGen,一个基于生成式AI技术的自动化3D世界生成引擎,助力低成本、高效率地创建真实且可交互的3D场景。用户仅需输入任务定义或场景图…

GitHub Copilot:AI编程助手的架构演进与真实世界影响

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1. 技术背景与核心架构 GitHub Copilot 是由 GitHub 与 OpenAI 联合开…

PDF OCR + 大模型:让文档理解不止停留在识字

在企业数字化的实际场景中,PDF OCR 已经很普遍了:从扫描件提取文本、表格到生成可搜索 PDF。但这类技术往往停留在"把图片变成文字",对文档背后的语义、逻辑、业务价值理解不足。 而当 OCR 遇上大语言模型(LLM&#xff…

半敏捷卫星观测调度系统的设计与实现

半敏捷卫星观测调度系统的设计与实现 摘要 本文详细阐述了一个基于Python的半敏捷卫星观测调度系统的设计与实现过程。系统针对半敏捷卫星特有的机动能力限制,综合考虑了地面目标观测需求、卫星资源约束、能源管理等多重因素,提出了一种混合启发式算法解…

软件测试中,常用的抓包工具有哪些?抓包的原理是什么?

回答重点在软件测试中,常用的抓包工具主要有:1)Fiddler2)Wireshark3)Charles4)Postman(它的拦截器功能也可以用于抓包)5)tcpdump抓包的原理大致是通过安装在本地的抓包工…

Cesium学习(二)-地形可视化处理

Cesium地形可视化是其核心功能之一,允许开发者在3D地球中展示真实的地形数据。以下是关于Cesium地形可视化的详细处理方法: 文章目录1. 启用地形可视化基本地形加载自定义地形提供者2. 地形相关操作地形高度采样地形夸张效果3. 地形可视化设置地形照明效…

《告别 if-else 迷宫:Python 策略模式 (Strategy Pattern) 的优雅之道》

《告别 if-else 迷宫:Python 策略模式 (Strategy Pattern) 的优雅之道》 大家好,我是你的朋友,一位与 Python 代码相伴多年的开发者。在我们的编程生涯中,几乎都曾与一种“代码怪兽”搏斗过,它就是那冗长、复杂、牵一发而动全身的 if-elif-else 结构。 每当一个新的需求…

Redis--day7--黑马点评--优惠券秒杀

(以下内容全部来自上述课程)优惠券秒杀 1. 全局唯一ID 每个店铺都可以发布优惠券:当用户抢购时,就会生成订单并保存到tb voucher order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显受单表数据量的限制…

Vue 与 React 深度对比:设计哲学、技术差异与应用场景

一、核心设计理念对比 特性 Vue React 设计目标 渐进式框架,降低学习曲线 构建大型应用,保持灵活性 设计哲学 “约定优于配置” “配置优于约定” 核心思想 响应式数据绑定 函数式编程 + 虚拟DOM 模板语言 HTML-based 模板 JSX(JavaScript XML) 状态管理 内置响应式系统 依…