转发和重定向

shuyepl 2022-06-28 21:23:21
Categories: Tags:

想在 web 应用中完成资源的跳转,可以使用下面的方式

转发和重定向的区别

代码上的区别

转发

request.getRequestDispatcher("dept/list").forward(request,response);

重定向

response.sendRedirect(request.getContentPath() + "/b");

注意:转发的链接中不需要加项目名,而重定向的链接中需要加项目名,因为重定向是由浏览器发送的请求,所以需要加项目名

形式上的区别

转发

转发使用的是同一次请求,浏览器只发送一次请求,对应的 WEB 程序接收到请求之后,在程序执行过程中遇到了转发的语句,然后将这个请求和转发发送给了转发的对象,转发的对象接受到请求之后,执行相应的程序,将最终的结果通过响应返回给浏览器,所以在转发的时候,地址栏上面的地址不会改变,其实就是服务器内部资源的跳转,在这里讲述的整个程序执行过程中只有一个 request 对象和一个 response 对象

重定向

重定向的整个过程是,浏览器向服务器发送请求,对应的 WEB 程序接受浏览器的请求之后开始执行相应的程序,在执行的过程中遇到了重定向的语句,然后根据重定向语句内参数的地址,将一个全新的地址通过响应发送给了浏览器,浏览器再根据响应得到的地址自动向服务器重新发送一次请求(第二次发送请求了),所以浏览器地址栏上面的地址会发生改变,在这里讲述的整个程序执行过程中,一共有两个 request 对象和两个 response 对象

注意:转发的请求如果是 post 请求,那么转发后的请求也是 post 请求,因为是同一个请求;而重定向就不会有这个问题,它是浏览器重新发送一次请求,这个请求是填写在浏览器地址栏上面的,是 get 请求。然后还有一个问题是,如果是转发的话,因为只发送一次请求,浏览器地址栏上面出现的内容是第一次请求的内容(就是你浏览器向第一个 WEB 程序请求的内容,这个请求会包含一些参数信息等),如果你提交一次请求之后,刷新浏览器,那么就会出现多次请求的情况(比如数据库被添加很多条一样的数据,因为数据库的数据信息被添加到地址中了,你一直刷新就相当于一直在发送请求),而重定向不会出现这种情况,因为重定向浏览器地址栏中的内容是第二次请求的地址,它刷新的时候只是刷新第二次请求的页面而已

本质上的区别

转发是由 WEB 服务器完成的,就是在 Tomcat 内部完成的

重定向这个动作是由浏览器来完成的

转发和重定向的选择

如果有通过 Servelet 对象向 request 中绑定数据,则使用转发,否则,使用重定向


参考资料:https://www.bilibili.com/video/BV1Z3411C7NZ?p=33&share_source=copy_web