当前位置:网站首页>重定向和请求转发详解
重定向和请求转发详解
2022-04-23 15:09:00 【云杉木屋】
重定向和请求转发详解
摘要:这篇笔记着重介绍了重定向和请求转发这两个请求方式的区别、各自的特点。
1.请求转发
请求转发本身是一种服务器行为,其本质是客户端请求到达服务端之后,服务端将这个请求信息进行一个转发并且将请求转发的对象进行保存,此时如果我们使用的是浏览器,会发现浏览器上方的URL路径栏中的路径是没有变化的。这是一种服务器的内部行为,是一个servlet将一个请求转发给服务器内部的另一个servlet的行为,这种跳转只能在服务器内部发生,也就是说只能将请求转发到一个位于该服务器内部的资源中,而不能转发到外部,这个和服务器内部的请求信息保存方式有关。接下来我们使用图解来描述请求转发的过程:
我们在客户端中向服务端发出请求,首先需要使用URL进行一次路径构建,建立好连接之后我们才可以发送我们的请求,这是一个计算机网络相关的知识,我们在进行网络通信之前,首先会通过某种方式建立起一个连接,然后再进行数据传输,数据传输中的主体就是我们发出的请求,我们的请求在服务器外部实际上没有一种规范化的保存格式,它们就是网线上的电信号或者光信号,此时他们位于物理层,物理层的数据不能被应用层的应用直接识别,但是它们可以通过链路层协议被指定的服务器接收,被服务器接收之后,自然就需要驱动和操作系统的处理,然后发送到Tomcat了,在接收到信息之后Tomcat会将这些请求信息转化为HttpServlet格式保存在自身进程之中,并且根据其请求目标进行发送,如上图它被发送给了ServletA,ServletA是一个Servlet,在Servlet中,要求请求被转化为HttpServletRequest的格式,因此这里还存在一次格式转化,而ServletA发现其中存在请求转发的操作,于是执行相关代码,Tomcat就会将这个请求对象进行格式转换,先转换为HttpServlet的格式,然后再转发给另一个Servlet。在这个过程中,HttpRequest不能被转化为Request,而只能是在HttpServletRequest与HttpRequest两个状态间转换,因为Tomcat不提供将内部格式重新变为Request格式的功能,因此,请求转发不能向外部资源跳转,并且是客户端对服务端的一次请求。
请求转发是一种服务器端行为,和用户无关,完全由服务端实现。
2.重定向
重定向和请求转发都可以实现页面跳转的功能,但是我们在学习他们的时候也就是止步于此了,顶多知道重定向会让URL发生改变,而对于资源的请求也不能再使用之前页面的相对路径方式,只能是重新以当前的页面为出发点进行请求了。这是为什呢,我们用图解的方式来看看重定向的原理:
在重定向中,使用到了另一个对象,Response对象,这个对象是专门向客户端返回信息用的,使用重定向的时候,Servlet没有再继续向下跳转,而是使用HttpServletResponse对象向客户端进行了返回,它将ServletB的地址返回给了客户端,然后让客户端去重新访问这个地址,于是客户端就又发出了一次请求,这次请求是直接向ServletB的请求。这就解释了为什么我们使用重定向的时候,URL会发生改变,因此我们重新发送了一次请求,重定向是一个二次请求,和请求转发是不同的,与此同时,ServletA返回的这个地址不一定是服务器内部资源地址,也可以使一个站外地址,这样一来就能实现站外资源的跳转。
请求转发不是单纯的服务端行为,而是一种服务器端指导的客户端行为。
3.总结
在使用浏览器观察的时候我们能够发现请求转发是只有一次请求,而重定向则出现了二次请求,二者各有利弊,重定向的时间更长,并且需要重新定位资源,请求转发时间稍短,但是只能访问站内资源,通常我们在书写站内网页跳转的时候不会使用重定向,这是为了避免因为重新定位资源引起的麻烦,当然我们对于资源的访问使用绝对定位的方式也是不碍事的,这里只能说是根据具体情况做选择了。
版权声明
本文为[云杉木屋]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_41219157/article/details/124350059
边栏推荐
- LeetCode153-寻找旋转排序数组中的最小值-数组-二分查找
- nuxt项目:全局获取process.env信息
- Thinkphp5 + data large screen display effect
- Share 20 tips for ES6 that should not be missed
- Differential privacy (background)
- SQL中HAVING和WHERE的区别
- 如何设计一个良好的API接口?
- asp. Net method of sending mail using mailmessage
- How to use OCR in 5 minutes
- Share 3 tools, edit 5 works at home and earn more than 400
猜你喜欢
How does eolink help telecommuting
博睿数据携手F5共同构建金融科技从代码到用户的全数据链DNA
8.2 text preprocessing
Differential privacy (background)
Detailed explanation of C language knowledge points - data types and variables [2] - integer variables and constants [1]
LeetCode151-颠倒字符串中的单词-字符串-模拟
Tencent has written a few words, Ali has written them all for a month
Borui data and F5 jointly build the full data chain DNA of financial technology from code to user
如何设计一个良好的API接口?
我的树莓派 Raspberry Pi Zero 2W 折腾笔记,记录一些遇到的问题和解决办法
随机推荐
LeetCode167-两数之和II-双指针-二分-数组-查找
Baidu written test 2022.4.12 + programming topic: simple integer problem
When splicing HQL, the new field does not appear in the construction method
How to use OCR in 5 minutes
PSYNC synchronization of redis source code analysis
[proteus simulation] automatic range (range < 10V) switching digital voltmeter
Go basic reflection
Tun equipment principle
C语言超全学习路线(收藏让你少走弯路)
API gateway / API gateway (III) - use of Kong - current limiting rate limiting (redis)
What is the role of the full connection layer?
Basic operation of circular queue (Experiment)
ffmpeg安装遇错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
Detailed explanation of C language knowledge points -- data types and variables [1] - carry counting system
Unity_ Code mode add binding button click event
调度系统使用注意事项
Practice of unified storage technology of oppo data Lake
Little red book timestamp2 (2022 / 04 / 22)
About UDP receiving ICMP port unreachable
Nuxt project: Global get process Env information