转发和重定向

475 阅读3分钟

什么是转发与重定向

日常我们使用浏览器最常用的就是在不同的页面中跳转,而在Servlet中的页面跳转使用的就是转发和重定向,也可以简单的认为转发和重定向就是实现页面的跳转,但是肯定是有区别的

转发

request.getRequestDispatcher("xxx.jsp").forward(request,response);这个例子就是一个简单携带request和response的转发,从这句代码分析我们可以得知,这个转发需要request对象,我们加入源码查看.getRequestDispatcher(String path)这个方法的返回值是一个RequestDispatcher对象,百度得知这个类是一个Web资源包装器,查看源码发现有两个方法forward()include()(那肯定是主要介绍forward()方法哈,有兴趣可以自行百度两个方法的详解)forward()用来转发request和response给指定的web资源,看到这里应该对这个代码有了一点理解了,首先将web资源路径传递到RequestDispatcher对象中,再调用forward方法将request和response一起传递给指定的web资源,实现携带请求转发

重定向

response.sendRedirect("https://www.baidu.com");实现简单的重定向,本质也是跳转

共同点

本质都是实现页面的跳转

不同点

  1. 地址栏
    • 转发的地址栏不会改变由于转发是在服务端进行的,浏览器并不知道,所以只会显示浏览器请求的页面地址
    • 重定向的地址栏会改变,跳转发送在客户端
  2. 请求次数
    • 转发没有产生新的请求,是同一个请求
    • 重定向产生了新的请求
  3. request域
    • 转发由于是同一个请求,所以request域不变
    • 重定向request域发生改变
  4. 跳转范围
    • 转发只限制在当前web项目中
    • 重定向没有限制,任何web资源(包括网络上的web资源)
  5. 跳转方式
    • 转发使用RequestDispatcher对象的forward()
    • 重定向用response.sendRedirect()

转发与重定向的浅层原理

转发原理

20210406132824

重定向原理

20210406133317


  1. 什么时候用转发,什么时候用重定向?

    当我们需要携带数据存进request域中保存,跳转界面读取request域中的数据,这个时候我们需要用到转发。

    不需要携带数据,只进行请求处理并不暴露Servlet进行跳转,可以用重定向

    判断什么时候用转发还是重定向可以从以下几点判断

    • request域
    • 地址栏

当然这只是一个参考,具体业务具体分析,还需要注意的是无论是转发还是重定向,后续代码还是会运行,并不会跳转而停止,除非手动return