请问重定向与请求转发有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问重定向与请求转发有啥区别?相关的知识,希望对你有一定的参考价值。

一、目标不同

转发是服务器行为,重定向是客户端行为 。

二、请求次数不同

1、重定向是两次request 。

第一次,客户端request一个网址,服务器响应,并response回来,告诉浏览器,你应该去别一个网址。

2、请求转发只有一次请求

三、网址定位不同

重定向的网址可以是任何网址,请求转发只能是指定网址。

四、导致的结果不同

不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

1、网站调整(如改变网页目录结构);

2、网页被移到一个新地址;

3、网页扩展名改变(如应用需要把.php改成.html或.shtml)。

参考资料:百度百科-重定向

参考技术A

重定向和请求转发的区别

1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向

2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址

3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变

4、重定向是两次request,转发只有一次请求

5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

扩展资料:

网站重定向的注意事项

1.若准备将服务器上的文件移到其它地方时,须就以下信息正确地通知搜索引擎的爬行程序:

目标地址:这些文件被移向何方

移动属性:暂时移走还是永久性移走

2.对拥有多个域名的网站,专家建议应把那些不想在搜索引擎上推广的域名用301跳转命令来永久性重定向,确保网站实施了正确的301重定向。

参考资料:重定向-百度百科



参考技术B

请求转发和重定向的区别:

(一)、request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。

response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。

所以转发中数据的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的数据的。只能用session。

(二)、forward()更加高效,在可以满足需要时,尽量使用RequestDispatcher.forward()方法。 

(三)、RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。

sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

(四)、重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问。

扩展资料

关于重定向:

我们在网站建设中,时常会遇到需要网页重定向的情况:

1.网站调整(如改变网页目录结构);

2.网页被移到一个新地址;

3.网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

参考链接  百度百科  重定向

参考技术C 重定向是有方向性的,而请求转发,咋还有未知的方向?后者比前者更普遍和宽泛 参考技术D web项目都是在tomcat容器中完成的;
web组件:servlet(java代码)和jsp俩种;
重定向:只限定在servlet中,通过改请求的url-pattern值,响应给另一个请求response.sendRedirect(“url-pattern值”);是俩次请求了。
转发:servlet(java代码)和jsp之间的传递,肯定就是转发了。一次请求。
(为了好理解,可能说的绝对了)

请求转发与请求重定向的区别

请求转发:

请求转发,即request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端;

请求重定向:

请求重定向,即response.sendRedirect(),是一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。


用生活中一个常见的例子来说明两者之间的区别,某人要去办理护照:

转发:某人去了甲局,甲局看了之后,直到护照应该由乙局来管,但甲局的工作人员并没有赶走某人,而是让某人等着,自己在办公室后面联系了乙局的工作人员,乙局护照办好后送到了甲局,然后甲局的工作人员将护照交给了某人;

重定向:某人去了甲局后,甲局的工作人员说护照不归他们关,应该去乙局。然后某人自己去了乙局,办了护照。


这里写一个例子演示两者的不同。新建一个web项目,创建三个页面:reg.jsp、response.jsp、request.jsp。

reg.jsp代码如下:

  <body>
    <h1>你好</h1><hr>
    <form name="regForm" action="response.jsp" method="post">
    <table>
      <tr>
        <td>用户名:</td>
        <td><input type="text" name="username"/></td>
      </tr>
      <tr>
         <td colspan="2"><input type="submit" value="提交"/></td>
      </tr>
    </table>
    </form>
  </body>
这里输入用户名,然后交给response.jsp处理。页面如下:


response.jsp代码如下:

<%
    response.setContentType("text/html;charset=utf-8");
    
    out.println("<h1>response内置对象</h1>");
    out.println("<hr>");
    response.sendRedirect("request.jsp");
    //request.getRequestDispatcher("request.jsp").forward(request, response);
%>
首先,使用重定向交给request.jsp来处理。

response.jsp代码如下:

<body>
  <h1>request对象</h1><hr>
     你是谁?<%=request.getParameter("username") %>
  </body>
这里仅仅获得用户名进行输出。

使用重定向时,结果如下:

可以看到,输入的用户名没有显示出来,这是因为重定向本质上相当于两次请求,而前一次请求不保存,所以没能得到用户名。同时,可以看到地址栏中的URL地址由response.jsp变为了request.jsp。

第二次,修改response.jsp的代码如下:

<%
    response.setContentType("text/html;charset=utf-8");
    
    out.println("<h1>response内置对象</h1>");
    out.println("<hr>");
    //response.sendRedirect("request.jsp");
    request.getRequestDispatcher("request.jsp").forward(request, response);
%>
使用转发,将请求转发给request.jsp来处理,结果如下:


可以看到,页面得到了请求中的用户名并进行显示,这是由于转发时客户端只有一次请求,服务器会保存这次请求,等到转发返回时将结果返回给客户端。同时,页面显示的是request.jsp的内容,但地址栏中的URL地址并没有变化。


这就是请求转发与请求重定向的区别。

以上是关于请问重定向与请求转发有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

请求转发与请求重定向的区别

请求转发与请求重定向的区别

重定向与请求转发的区别

重定向,请求转发,get,post

请求转发与请求重定向的区别

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