# Forward和Redirect的区别

----------

## 通俗比方

- 直接转发请求(Forward)就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;

- 间接转发请求(Redirect)就相当于:"A找B借钱,B说没有,让A去找C借"。

## 区别

- 直接转发请求(Forward),客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。

- 间接转发请求(Redirect),服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。

## 分辨技巧

通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单击某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发。

## 原理

### 直接转发请求(Forward)

直接转发方式用的更多一些,一般说的请求转发指的就是直接转发方式。Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给哪个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。

javax.servlet.RequestDispatcher接口是请求转发器必须实现的接口,由Web容器为Servlet提供实现该接口的对象,通过调用该接口的forward()方法到达请求转发的目的,示例代码如下:

```

//Servlet里处理get请求的方法

public void doGet(HttpServletRequest request, HttpServletResponse response){

//获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置

RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL");

//调用forward()方法,转发请求

requestDispatcher.forward(request,response);

}

```

![](http://onmer39jj.bkt.clouddn.com/image/240531979609.png)

上图所示的直接转发请求的过程如下:

1. 浏览器向Servlet1发出访问请求;

2. Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;

3. 最终由Servlet2做出响应。

### 间接转发请求(Redirect)

间接转发方式,有时也叫重定向,它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL,示例代码如下:

```

//Servlet中处理get请求的方法

public void doGet(HttpServletRequest request,HttpServletResponse response){

//请求重定向到另外的资源

response.sendRedirect("资源的URL");

}

```

![](http://onmer39jj.bkt.clouddn.com/image/214341663208.png)

上图所示的间接转发请求的过程如下:

1. 浏览器向Servlet1发出访问请求;

2. Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;

3. 浏览器向servlet2发出请求;

4. 最终由Servlet2做出响应。

java中forward和redirect_Forward和Redirect的区别相关推荐

  1. java中forward和redirect_forward和redirect的区别?

    forward:转发:redirect:重定向.区别如下: 浏览器 url 地址显示不同 服务端通过 forward 返回,浏览器 url 地址不会发生变化:服务器通过 redirect 返回,浏览器 ...

  2. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  3. 【Java学习笔记之二十九】Java中的equals和==的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String(&quo ...

  4. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  5. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  6. Java中的LongAdder和AtomicLong有什么区别?

    ● Java中的LongAdder和AtomicLong有什么区别? 考点:JDK 参考回答: JDK1.8引入了LongAdder类.CAS机制就是,在一个死循环内,不断尝试修改目标值,直到修改成功 ...

  7. Java中 byte[]数组序列化和fastjson序列化区别

    Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...

  8. JAVA中的方法和构造方法有什么区别

    JAVA中的方法和构造方法有什么区别 1.方法有返回类型,方法名小写,不能和类名相同:构造方法没有返回类型,void也不行,名与类名相同. 2.构造方法是初始化对象的重要途径,所以就算你给一个类没有定 ...

  9. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法 1.简单区别: final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承. finally是异常处理语句结构 ...

最新文章

  1. 4、利用zookeeper来实现client端自动感知服务器端在线情况,并且可以进行负载均衡。...
  2. ​“好师父”如何破解大学生就业难题
  3. 如何使用Java keytool命令行创建一个自签名证书
  4. js网页文件资源加载器
  5. 一道微软Python面试题(文末附python教程丶电子书资料分享)
  6. amcharts去除版权标志
  7. mysql 函数无法访问_mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败...
  8. 深度装机大师一键重装_深度一键重装系统软件
  9. 单片机入门教程之认识单片机
  10. PCB线路板制作之蚀刻工艺流程
  11. 中小学机器人类竞赛活动2020-2021
  12. Nginx模块开发之http handler实现流量统计(入门篇)
  13. 2020年区块链行业十大趋势
  14. 学习C语言:自幂数最通俗讲解
  15. LINUX 下SQL server 安装、配置及对接ceph功能性能测试
  16. ThreeJS-太阳球围绕旋转(二十四)
  17. Webpack--模块热替换(HMR)
  18. 杨辉三角python输出
  19. 2021,前端月薪30K已是白菜价?
  20. 打开计算机窗口的快捷键是什么,快速切换窗口的快捷键是什么

热门文章

  1. mysql主键被强制定义_主键约束用来强制数据的( )完整性。_学小易找答案
  2. 微信群发太简单了,三秒通知到你的全部好友!Python牛逼
  3. 【算法】 算法和数据结构绪论
  4. 学记笔记 $\times$ 巩固 · 期望泛做$Junior$
  5. 【机器学习】KNN算法及K值的选取
  6. nouveau禁用失败
  7. chrome设置微信ua_Chrome模拟微信浏览器UA访问教程
  8. 什么是Java字节码?
  9. 33 _ 加餐3:定位应用问题,排错套路很重要
  10. linux如何查看光驱刻录日志,linux下光驱刻录