当前位置:网站首页>转发和重定向的区别及使用场景
转发和重定向的区别及使用场景
2022-07-30 00:13:00 【小何┌】
目录
本质区别
转发 :是由服务器发起的,转发前后是同一次请求,共用同一个请求域(request域)。
浏览器向服务器请求一次。
重定向 :是由浏览器发起的,重定向前后是两次请求,各用各的请求域。
浏览器向服务器请求两次。

转发前后的地址不变,请求前是 http://localhost:8080/a,请求后也是 http://localhost:8080/a。
重定向前后地址变化,请求前是 http://localhost:8080/a,请求后是 http://localhost:8080/xxx。
代码区别
转发和重定向代码上的区别 :
// 转发 :
// request :请求,dispatcher :调度器
// requestDispatcher :请求调度器。
request.getRequestDispatcher("/login").forward(request, response);
// 重定向 :
response.sendRedirect("/项目名/homepage");可以看到,转发是使用request进行的,在forward()中将请求前的request和response给请求后继续使用,这也就是为什么转发是同一次请求,并且转发可以携带数据 。
重定向是使用response进行的,简单的sendRedirect()就可以完成。
值得一提的是,为什么转发中的地址不需要加项目名,重定向却需要呢?
我们知道,前端向后端发送请求就需要带项目名。
转发是由后端服务器处理的,并没有前端的事,所以不需要加项目名。
重定向是浏览器再次发送请求,属于前端发送请求,所以需要加项目名。
由于转发前后共用请求域(request域),所以转发可以携带数据,将数据存放在请求域中,request.setAttribute(key, value),在转发后可以使用requestgetAttribute(key, value)取出数据。
重定向前后不是同义词请求,但是也可以携带数据。只需要在地址中携带就可以 :
/StudentSystem/homepage?id=123&name=xiaoming
// 想要取出数据 :
request.getParameter("id");
request.getParameter("name");两者携带数据以及取出数据的方式要记清。
应用时机
以登陆举例 :
在前端输入id、password等数据后要传到后端,我们需要查询数据库看有没有这个用户。
如果成功,要进入这个人的主页。
如果失败,要返回 登陆界面并且要保留用户刚才输入的信息。
这样的功能该怎样实现呢?
用户登陆成功,之后的页面有很多都需要用户的信息,明显request域不够用,我们就将用户信息存入session域,这是已经不需要携带数据了,我们就使用重定向将页面跳转到用户首页就行了。
用户登陆失败,我们需要跳转回登陆界面,还需要携带用户刚才输入的信息,由于这个信息不需要长久保存,我们就将其存入request域,转发到登录界面。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String id = request.getParameter("id");
String password = request.getParameter("password");
User user = UserDao.selectUser(id, password);
if(user != null) {
// 登陆成功,将用户存入session域以便日后使用
request.getSession().setAttribute("user",user);
// 用户信息已经存入session
// 直接使用重定向进入用户主页
response.sendRedirect("/StudentSystem/home");
} else if(user != null) {
// 登陆失败,跳回登陆界面
// 同时需要携带用户刚刚输入的信息
request.setAttribute("user",user);
request.getRequestDispatcher("/login").forward(request, response);
}
}边栏推荐
- rk-boot框架实战(1)
- Toutiao We-Media Operation: How to Gain 500+ Fans in Toutiao Today?
- Expansion of Parallel I/O Port in Single Chip Microcomputer Development
- 一文解答web性能优化
- EA&UML日拱一卒-多任务编程超入门-(9)线程同步
- 【云原生Kubernetes】二进制搭建Kubernetes集群(中)——部署node节点
- Reading notes. This is the psychology: see through the essence of the pseudo psychology (version 10)"
- Some personal understandings about MySQL indexes (partially refer to MySQL45 lectures)
- Add, delete, modify and query the database
- 【经验】经验总结-经验教训
猜你喜欢

go语言(函数、闭包、defer、panic/recover,递归,结构体,json序列化与反序列化)

i.MX6U-driver development-3-new character driver

二维数组的查找

中文语义匹配

18 Lectures on Disassembly of Multi-merchant Mall System Functions

读书笔记:《这才是心理学:看穿伪心理学的本质(第10版)》

更换可执行文件glibc版本的某一次挣扎
![CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构](/img/6a/0a446eb00fb73275897cbfb336e0b0.png)
CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构

Worthington细胞分离技术丨基本原代细胞分离方法和材料

论文精读——YOLOv3: An Incremental Improvement
随机推荐
WeChat developer tools set the tab size to 2
微信开发者工具设置制表符大小为2
ZLMediaKit源码学习——UDP
2022杭电多校第三场 Two Permutations (dp, 哈希)
Worthington优化技术:细胞定量
vim相关介绍(三)
ApplicationContext的三大实现
call、apply 以及 bind 的区别和用法
单片机开发之基本并行I/O口
How to design and implement report collaboration system for instruction set data products——Development practice of industrial collaborative manufacturing project based on instruction set IoT operating
二维数组的查找
Getting Started with Sentinel
头条号自媒体运营:如何在今日头条涨500+粉丝?
Elephant Swap:借助ePLATO提供加密市场的套利空间
NumPy(二)
直播平台搭建,设置状态栏颜色
Worthington酶促细胞收获&细胞粘附和收获
全网最强 JVM 来袭!(至尊典藏版)
One article to answer web performance optimization
基于TNEWS‘ 今日头条中文新闻(短文本)分类