重定向和请求转发的区别

一次重定向的过程

我的代码里面已经写好了,redirectAndFoward.jsp页面上有一个表单,表单重定向到redirectAndFowardTarget.jsp,那么这一次的重定向过程为:

1、以指定方式(表单看method,直接URL发起就是GET)发一次请求到后台,后台处理重定向,返回一个302的HTTP状态码给客户端,并在response里面带一个Location用于标识重定向的地址

2、以Location的地址为目标地址,客户端再发起一次请求

 

一次请求转发的过程

以指定方式(表单看method,直接URL发起就是GET)发一次请求到后台,后台直接跳转到将要重定向的地址,如果成功则返回状态码200给客户端:

 

重定向和请求转发的区别

1、从上面的一次重定向和一次转发的过程来看,我们可以得出第一个差别点,就是重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向

2、第二个差别点也很明显,重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址

网上关于重定向和请求转发的区别的文章有很多,里面的区别点也有很多,但是总结起来无非就是这两点,再多的区别点也都是这两点的扩充,所以,重定向和请求转发的区别理解了这两点的差别就可以了。另外还有一点,不是重定向和请求转发之间的区别,但是值得注意,那就是重定向和请求转发之后的代码都会运行,直到方法结束或者遇到了return语句

 

重定向和请求转发URL参数的解读

我们知道在Java Web中,一个Servlet分别是这么写重定向和转发的代码的:

1、response.sendRedirect("XXX");

2、request.getRequestDispatcher("XXX").forward(request, response);

这个括号里面的参数也是有一定的规则的,我自己的总结如下:

1、重定向的时候,如果参数为"http://xxxxxxxxxx",那么重定向到的是指定的重定向地址,无论该重定向地址是内部的还是外部的

2、如果参数不是"http://xxxxxxxxxx"的样子,而是一般的写法,那么都是Tomcat内部跳转(注意是Tomcat内部跳转而不是项目内部跳转),重定向和请求转发的时候有些区别:

(1)重定向,如果XXX以"/"开头,则表示目标地址为http://ip:port/XXX;如果不以"/"开头,则表示目标地值为http://ip:port/项目名/XXX

(2)请求转发,无论XXX是否以"/"开头,都跳转到http://ip:port/项目名/XXX

 

重定向和请求转发选择的个人建议

页面跳转建议使用重定向,有内部Servlet跳转建议使用转发。

选择重定向作为页面跳转的理由

1、转发请求地址不会变化,这就导致了开发者并不知道实际转发的目标页面是哪个,对于开发者来说这真的是一件糟糕的事,不知道转发的目标页面会在出错的时候给定位问题带来很大的麻烦

2、假如开发者在Servlet中做了耗时间的查询数据库操作,然后放到session里面去,让目标页面拿session显示给用户。此时如果使用转发,那么在刷新这个页面的时候,该Servlet会被再请求一遍,也就是说把查询数据库->设置session这个步骤再做一遍,而实际上这是毫无意义的。重定向则不会有问题,由于重定向之后的是一个.jsp页面,刷新页面无非是让页面重新加载一次罢了。

3、转发只能在站内跳转,重定向可以跳转到任意想要的地址----只要这个地址存在,所以请求页面的时候转发相比重定向也有局限性

因此,虽然转发的速度比重定向快,但是从规避问题的角度而言,页面跳转使用重定向绝对是比转发更好的选择。

选择转发作为内部Servlet跳转的理由

如果代码逻辑是ServletA->ServletB->*.jsp,使用转发,那么这三次操作都在一次请求中,而如果使用重定向,那么客户端将发起三次请求,这真的毫无必要。因此,如果代码逻辑中含有内部的Servlet跳转,使用转发会使一个好的选择。

### 重定向请求转发的实现方式及区别 #### 实现方式 1. **重定向 (Redirect)** 在 Java Servlet 中,可以通过 `HttpServletResponse` 的 `sendRedirect()` 方法来实现重定向操作。此方法会向客户端发送一个新的 HTTP 响应,指示浏览器访问新的 URL 地址[^4]。 ```java @RequestMapping(value="/test/test01/{name}", method = RequestMethod.GET) public void test(@PathVariable String name, HttpServletResponse response) throws IOException { response.sendRedirect("/ceng/hello.html"); } ``` 2. **请求转发 (Forward)** 请求转发通过 `RequestDispatcher` 接口完成,服务器内部将当前请求对象传递给目标资源处理。这种方式不会改变客户端地址栏中的 URL[^3]。 ```java @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/target.jsp"); dispatcher.forward(req, resp); } ``` --- #### 区别分析 以下是两者的主要区别: 1. **HTTP 请求次数** - 重定向会触发两次 HTTP 请求:第一次是原始请求,第二次是由浏览器发起的新请求。 - 而请求转发仅涉及一次 HTTP 请求,在服务器端完成资源切换[^1]。 2. **URL 变化情况** - 使用重定向时,客户端浏览器的地址栏会被更新为目标 URL。 - 请求转发过程中,客户端看到的仍然是初始请求的 URL[^2]。 3. **数据共享能力** - 在请求转发中,可以利用 `HttpServletRequest` 对象在不同资源间共享数据(如设置属性)。 - 重定向由于涉及到两个独立的请求,无法直接共享数据,需借助 Cookie 或 Session 来保存信息。 4. **性能影响** - 因为重定向需要额外的一次网络交互,通常比请求转发消耗更多时间。 - 请求转发完全由服务器控制,效率更高。 5. **适用场景** - 如果希望用户感知到页面变化并能重新加载新页面,则适合采用重定向。 - 若只需在同一应用内快速跳转至另一资源而无需暴露具体路径细节,则优先考虑请求转发。 6. **后续代码执行行为** 不论是重定向还是请求转发,其后的代码均将继续运行直至函数结束或遇到 `return` 关键字为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值