转发和重定向区别
转发和重定向
1.0 面试提问
- 定义不同
- 跳转的方式不同
- 数据共享不同
- 最终的URL地址不同
- 代码实现不同
1. 转发
1.1 概念
转发实际上在服务器端进行页面的跳转操作,请求转发:一种在服务器内部的资源的跳转的方式。
访问A,A请求转发了B,访问A的同时就也访问到了B。
带参数跳到指定的页面,比如request。
访问A,进入A的网址,然后在A里面请求转发B,就是带着A的请求到了B。
1.2 特点
- 转发操作用户只请求了一次
- 转发操作用户请求的URL不发生改变
- 转发操作只能够转发服务器内部的资源.
- 转发操作过程中,任何一个步骤都可以获取用户的请求参数,获取之前其他操作添加的数据内容, 即请求域中的数据不会丢失。
- 转发操作是服务器行为。
1.3 方法(通过HttpServletRequest)
| 方法 | 含义 |
|---|---|
| 获取参数 | |
| String getParameter(String name); | 通过名称获取用户请求参数对应的数据 |
| Map(String,String[]) getParameterMap(); | 直接获取用户请求参数对应的map双边队列 |
| String[] getParameterValues(String names); | 通过名称获取对应的Value值 |
| 获取属性存储的数据 | |
| void setAttribute(String name,Object obj); | request 对象添加属性的操作, 要求提供属性名称和对应的属性值 ,属性名称是String 类型,值为Object 什么类型都可以 |
| Object getAttribute(String name); | 根据属性的名称获取对应的属性值,返回是Object。可使用强转。 |
| void removeAttribute(String name); | 删除属性的操作,根据属性名称删除属性信息,属性名称+属性值都删除 |
区分:
Parameter : 用户提交的数据,通过表单,ajax,等方式获取,数据形式是键值对的形式。Servlet获取的数据类型是String类型。
Attribute属性:服务器在转发的过程中的操作,方便后续资源的使用,在Attribute 属性中添加属性数据,类似于Map 类型。name = value 模式,value 类型不会限制。
1.4 Request域对象特征
域对象: 表示的是一定范围内的有效的对象
有效范围: 对于HttpServletRequest 对象是整个转发路径中的所有的相关的资源范围内有效。
1.5 实例
- 首先: Servlet 接收用户的请求,转发到中间的Servlet。
- 中间的Servlet 接收其他的Servlet转发访问,同时添加访问的内容,转发到最终的处理需求的Servlet。
- 最终的Servlet 完成针对于用户的响应的请求之后,同时用户的请求的数据和中间的Servlet添加属性数据。

@WebServlet("/test1")
public class ADispatchServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 解决Servlet中的乱码的问题req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");System.out.println("首先收到指定的请求操作");System.out.println("请求中的参数1是"+ req.getParameter("user1"));System.out.println("请求中的参数2是"+ req.getParameter("user2"));/*** 执行转发的操作通过request 对象进行调用指定的方法,然后通过forword转发到目标的资源中,提供请求对象和响应对象*/req.getRequestDispatcher("test2").forward(req, resp);}
}@WebServlet("/test2")
public class BDispatchServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*当前 Servlet 对应的请求和响应不是 Tomcat 服务器用户请求创建和绑定的而是上一个资源,在转发过程中, 提交给当前 Servlet 程序运行所需的请求和响应对象*/System.out.println("收到test1 中的转发");System.out.println("所需要的参数一"+req.getParameter("user1"));System.out.println("所需要的参数二"+req.getParameter("user2"));// 给当前的request对象添加属性值,进行传递操作req.setAttribute("none","张三,李四");req.getRequestDispatcher("test3").forward(req, resp);}
}@WebServlet("/test3")
public class CDispatchServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("重定向");System.out.println("获取请求中的1参数;"+req.getParameter("user1"));System.out.println("获取请求中的2参数;"+req.getParameter("user2"));System.out.println("获取上一级建立的属性的参数");System.out.println(req.getAttribute("none"));resp.getWriter().append((String)req.getAttribute("none"));}
}
1.6 总结
1. 得到转发器: RequestDispatcher request.getRequestDispatcher("/跳转的地址") 参数是要跳转的地址 2. 实现转发操作转发器对象.forward(request,response)表示的含义是 将请求和响应提交过去,保证转发过去的页面也能够有同样的request 和 response。总结
实现:request.getRequestDispatcher(“/跳转的地址”).forward(request,response);
2. 重定向
2.1 概念
重定向就是通过各种方法将各种网络请求重新定个方向转到其他的位置。也就是说在网页上设置一个约束条件,如果满足条件,就会自动跳转到其他的网页上。例如:网页重定向、域名重定向、路由的选择的变化也是重定向.
2.2 特点
- 用户请求多次(两次两次以上)
- URL会改变
- 浏览器行为
- 操作后用户无法获取请求资源和中间资源
- 可以定向至服务器内部资源,也能够访问服务器外部资源
2.3 核心
核心变量:
HttpServletResponse 对象
核心方法:
SendRedirect(String location) 完成对应的重定向的操作
response.sendRedirect("跳转的地址")
2.4 网页定向
在我们创建网站的时候,时常能够遇到网页需要重定向的情况
- 网站的调整,改变网页的目录结构
- 网页被移动到一个新的地址
- 网页拓展名称改变。
- 注册了多个域名的网站,也需要通过重定向让访问这个域名的用户自动跳转到主站点。

3. 使用区分总结
如果需要保存数据域中的数据,则需要进行转发的实现操作,否则需要使用重定向。
如果之后需要访问数据库,增删改的操作,需要使用重定向的操作,查询的时候使用转发。
| 区别 | 转发forward() | 重定向sendRedirect() |
|---|---|---|
| 根目录 | 包含项目的访问地址 | 没有项目的访问地址 |
| 地址栏 | 不会发生改变 | 会发生变化 |
| 哪里跳转 | 服务端进行的跳转 | 浏览器进行的跳转 |
| 请求域中的数据 | 不会丢失 | 会丢失 |
相关文章:
转发和重定向区别
转发和重定向 1.0 面试提问 定义不同跳转的方式不同数据共享不同最终的URL地址不同代码实现不同 1. 转发 1.1 概念 转发实际上在服务器端进行页面的跳转操作,请求转发:一种在服务器内部的资源的跳转的方式。 访问A,A请求转发了B,…...
java面试题(持续更新)
java面试题(持续更新) java 基础 java面向对象有哪些特征 面向对象的三大特征:封装、继承、多态 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,…...
【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议
人工智能(AI)是当今科技领域最热门和最有前景的话题之一,它已经渗透到了我们生活和工作的方方面面,给我们带来了许多便利和惊喜。而在AI的众多分支中,自然语言处理(NLP)是最贴近人类的一个领域&…...
实战打靶集锦-013-Loly
**写在前面:**记录博主的一次打靶经历 目录1. 主机发现2. 端口扫描3. 服务枚举4. web服务探查4.1 WordPress探测4.2 使用metasploit4.3 使用wpscan4.4 阶段性回顾5. 提权5.1 弱密码提权5.2 操作系统信息枚举5.3 定时任务枚举5.4 passwd信息枚举5.5 可执行文件枚举5.…...
程序员OKR学习法
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl OKR管理法 OKR(Objectives and Key Results)管理法是一种目标管理方法,旨在通过制定明确的目标和可量化的关键结果来帮助组织、团队和个人…...
【从零开始学习 UVM】6.6、UVM 激励产生 —— UVM Virtual Sequence【重要】
文章目录 使用virtual sequencer不使用virtual sequencervirtual sequence是一个容器,用于在环境中的virtual sequencer上启动多个sequence。 这个virtual sequence通常由一个具有对真实sequencers句柄的virtual sequencers执行。 需要virtual sequence的原因是当您需要在不…...
蓝桥杯:阶乘约数
蓝桥杯:阶乘约数https://www.lanqiao.cn/problems/1020/learning/ 目录 题目描述 填空题:答案是 39001250856960000 题目分析 AC代码(Java) 暴力 线性筛 题目描述 填空题 定义阶乘 n!123⋅⋅⋅n。 请问 100! (100 的阶乘)有…...
最大数字
[蓝桥杯 2022 国 B] 最大数字 题目描述 给定一个正整数 NNN。你可以对 NNN 的任意一位数字执行任意次以下 2 种操作: 将该位数字加 111。如果该位数字已经是 999,加 111 之后变成 000。 将该位数字减 111。如果该位数字已经是 000,减 111 之后变成 99…...
【java进阶08:异常】finally关键字、自定义异常类、用户业务作业、军队武器作业
java中的异常处理机制 异常在java中以类和对象的形式存在,那么异常的继承结构是怎样的?我们可以使用UML图来描述以下继承结构 画UML图的工具:Rational Rose、starUML等 Object下有Throwable(可抛出的) Throwable下有两…...
#课程笔记# 电路与电子技术基础 课堂笔记 第6章 半导体器件的基本特性
6.1 半导体基础知识 6.1.1 本征半导体 完全纯净的、结构完整的半导体称为本征半导体。 常用的半导体材料有硅和锗,它们都是四价元素,原子最外层轨道有四个价电子。 若将纯净的半导体制成晶体,则原子形成排列整齐的点阵。 点阵是由共价键提供…...
skimage.filters.apply_hysteresis_threshold详解
本文内容均参考scipy1.9.1scipy1.9.1scipy1.9.1版本的源码,若有任何不当欢迎指出 我们截取官方注释如下: def apply_hysteresis_threshold(image, low, high):"""Apply hysteresis thresholding to image.This algorithm finds regions …...
一、基础算法5:前缀和与差分 模板题+算法模板(前缀和,子矩阵的和,差分,差分矩阵)
文章目录算法模板前缀和模板子矩阵的和模板差分模板差分矩阵模板模板题前缀和原题链接题目题解子矩阵的和原题链接题目题解差分原题链接题目题解差分矩阵原题链接题目题解算法模板 前缀和模板 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]子矩阵的和模板 S[i…...
Python矩阵分解之QR分解
文章目录QR和RQ分解其他函数QR和RQ分解 记AAA为方阵,P,QP, QP,Q分别为正交单位阵和上三角阵,则形如AQRAQRAQR的分解为QR分解;形如ARQARQARQ的分解为RQ分解。 在scipy.linalg中,为二者提供了相同的参数,除了待分解矩阵…...
随机森林程序
n_estimators:数值型取值 含义:森林中决策树的个数,默认是10 criterion:字符型取值 含义:采用何种方法度量分裂质量,信息熵或者基尼指数,默认是基尼指数 max_features:取值为int型, float型, string类型…...
每日一练2627——变态跳台阶快到碗里来不用加减乘除做加法三角形
文章目录变态跳台阶思路:代码:快到碗里来思路:代码:不用加减乘除做加法思路:代码:三角形思路:代码:变态跳台阶 题目链接: 思路: 这个题目很容易理解&#…...
LeetCode-146. LRU 缓存
目录LRU理论题目思路代码实现一代码实现二题目来源 146. LRU 缓存 LRU理论 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓…...
#课程笔记# 电路与电子技术基础 课堂笔记 第3章 电路分析的几个定理
3.1 叠加定理 激励:电流源或电压源 响应:电流或电压 叠加定理一般用于已知激励或响应中的一种,求另一种。做法就是,每次只求一个激励作用下的响应,将其他激励置零,置零的具体做法是,电压源变…...
推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计
推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计 目录推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计前言匹配与非匹配1. 基于自适应反步控制的非匹配条件下的系统控制器设计问题描述控制器设计小结2. 基于自适应反步控制和推迟参数设计的非匹配条件…...
spring5.1+SmartInstantiationAwareBeanPostProcessor 解决循环依赖
SmartInstantiationAwareBeanPostProcessor 解决循环依赖的过程, 例如上面的 A依赖B, B依赖A SmartInstantiationAwareBeanPostProcessor 是 Spring 中的一个接口,它扩展了 InstantiationAwareBeanPostProcessor 接口并提供了对 Bean 的实例化和属性填充的更高级的…...
apply、call与bind
共同点: 都是函数对象的一个方法,作用是改变函数执行时的上下文,即改变函数体内部this的指向 var name "lucy"; var obj {name: "martin",say: function () {console.log(this.name);} }; obj.say(); // martin&…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
