直接请求转发(Forward)和间接请求转发(Redirect)两种区别?

  用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的。根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect)两种有何区别呢?本篇在回答该问题的同时全面的讲解两种请求转发方式的原理和区别。

【关键考点】

  • 请求转发的含义;
  • Forward转发请求的原理;
  • Redirect转发请求的原理。

【考题分析】

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于一个每个信息资源是共享的。

间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

最明显的区别就是:
redirect() 会丢失request的所有信息  它属于页面级的重定向,仅仅让你的浏览器重新访问一个新的url,作为浏览者,能很明显的看到浏览器url地址的变化,这和点击了一个普通的超链接的后果是一样的。
而 RequestDispatcher 的forward() 方法,是转发,需要request 和 response最为参数,就是将用户的请求,连同请求信息等内容,一起转发到服务器的另外一个servlet去处理,它不会丢失request信息。这一过程是服务器内部完成的,作为访问者,是感觉不到了,或者说是透明的,因此访客浏览器的url 是不会发生变化的。

举个通俗的例子:

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

间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。

下面详细阐述一下两者的原理:

一:间接请求转发(Redirect)

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

......
//Servlet中处理get请求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//请求重定向到另外的资源
    response.sendRedirect("资源的URL");
}
........

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

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
  3. 浏览器向servlet2发出请求;
  4. 最终由Servlet2做出响应。

二:直接请求转发(Forward)

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

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

......
    //Servlet里处理get请求的方法
 public void doGet(HttpServletRequest request , HttpServletResponse response){
     //获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置
   RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL");
    //调用forward()方法,转发请求
   requestDispatcher.forward(request,response);
}......

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

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
  3. 最终由Servlet2做出响应。

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

问:直接转发和间接转发的原理及区别是什么?

答:Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。

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

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

时间: 2024-11-09 00:10:17

直接请求转发(Forward)和间接请求转发(Redirect)两种区别?的相关文章

请求转发(Forward)和重定向(Redirect)的区别

forward(转发): 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址. redirect(重定向): 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 转发是服务器行为,重定向是客户端行为. 区别: 1. 从地址栏显示来说for

请求转发(forward) 和重定向(redirect)的区别?

   forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取   过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,   所以它的地址栏中还是原来的地址.   redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,地址栏中   是新的地址.    前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址:后者则   是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接.这样,从浏览

转发(forward)和重定向(redirect)的区别

转发与重定向的主要区别 转发 重定向 转发是服务器行为 重定向是客户端行为 转发浏览器url不改变 重定向浏览器url改变 转发request请求数据不丢失 重定向request请求数据丢失 转发效率较高 重定向效率较低 工作流程: 转发:客户浏览器发送http请求--web服务器接受此请求--调用内部的一个方法在容器内部完成请求处理和转发动作--将目标资源发送给客户: 重定向:客户浏览器发送http请求--web服务器接受后发送302状态码响应及对应新的location给客户浏览器--客户浏览

ajax请求json文件的时候缓存问题的两种解决方法

第一种是在get请求后面增加时间戳参数 // 直接读取json文件, var jsonUrl = urlPath + '/outerData/selectType.json?random='+new Date().getTime();//url 加上一个随机参数(时间也算随机参数), 就可以避免浏览器json缓存 $.getJSON(jsonUrl,function(data){ jsonData = data; /**大类*/ for(var i = 0; i < jsonData.lengt

同一个请求分配一个traceId的两种方式

有时候我们需要某个请求下的所有的traceId都是一致的,以获得统一解析的日志文件.便于排查问题. 为每一个请求分配同一个traceId据我所知有两种方式:MDC和ThreadLocal,MDC的内部实现也是ThreadLocal,下面分别介绍这两种方式. 一.MDC MDC(Mapped Diagnostic Contexts),翻译过来就是:映射的诊断上下文.意思是:在日志中(映射的)请求ID(requestId),可以作为我们定位(诊断)问题的关键字(上下文). 有了MDC工具,只要在接口

HttpServletRequest对象请求转发和HttpServletResponse对象请求重定向之间的区别

HttpServletRequest对象request代表浏览器请求对象,HttpServletResponse对象代表服务器响应对象,当用浏览器访问web服务器,发出请求时,Servlet调用service方法并传入该两个对象,然后通过请求转发或者重定向到下一个jsp页面或者Servlet,下面是request对象请求转发和response对象请求重定向的区别: 区别一.RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件:而HttpServletRe

【转发】GET和POST两种基本请求方法的区别

原文来源:https://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么. 当你在面试中被问到这个问题,你的内心充满了自信和喜悦. 你轻轻松松的给出了一个“

转发(forward)和重定向(redirect)

转发和重定向 参考:http://www.2cto.com/kf/201107/97118.html 以前写的一个注册页面: 1 package com.ifly.bbs.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.Htt

转发(Forward)和重定向(Redirect)的区别

转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现的. RequestDispatcher 可以通过HttpServletRequest 的 getRequestDispatcher()方法获得.例如下面的代码就是跳转到 login_success.jsp 页面. request.getRequestD