转发与重定向详细讲解

序言

转发和重定向是两种常见的网页跳转方式,它们都能让用户从一个网页跳转到另一个网页。然而,它们之间存在一些差异。本文将重点介绍转发和重定向的区别。
##、 转发

定义

转发(Forwarding)是一种在服务器端重定向用户请求的机制。具体来说,当Web应用程序中的某个资源(如Servlet或JSP页面)处理完用户请求后,它可以选择不直接生成响应返回给客户端,而是将请求转发给另一个资源来处理,并最终由那个资源生成响应返回给客户端。

图解

在这里插入图片描述

特点

1.地址栏不会改变:在进行转发操作时,客户端浏览器的地址栏(URL)不会发生变化。这是因为转发是在服务器端进行的,浏览器并不知道请求已经被转发到了另一个资源。
2.只能转发到当前Web应用内的资源:转发操作通常只能将请求转发到当前Web应用程序内的其他资源(如Servlet、JSP页面等)。它不能用于跳转到其他Web应用程序或外部网站的资源。
3.可以传递数据:在转发过程中,可以将数据保存在request域对象中,并在目标资源中访问这些数据。这使得在转发过程中传递数据变得非常方便。
单次请求:转发操作只涉及一次HTTP请求。当请求被转发到目标资源时,它会被视为原始请求的延续,而不是一个新的请求。
4.服务器端行为:转发是一种服务器端的行为。当服务器收到客户端的请求后,它会根据请求中的信息(如URL、请求参数等)来决定将请求转发到哪个目标资源,并在服务器端完成整个转发过程。
5.数据共享性问题:当需要将后台获取的数据传送到JSP上显示的时候,就可以先将数据存放到Request对象中,再转发到JSP从属性域中获取。此时由于是“转发”,所以它们二者共享Request对象中的数据。

代码实现

import javax.servlet.*;  
import javax.servlet.http.*;  
import java.io.IOException;  
  
public class MyServlet extends HttpServlet {  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // 处理请求(比如设置一些属性到request对象中)  
        request.setAttribute("message", "Hello from Servlet!");  
  
        // 获取RequestDispatcher实例,用于转发请求  
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/result.jsp");  
  
        // 使用RequestDispatcher的forward方法转发请求和响应  
        dispatcher.forward(request, response);  
  
        // 注意:在forward方法之后,不应该再有代码执行,因为响应已经被提交  
        // 如果这里还有输出流的写入操作,会抛出IllegalStateException  
    }  
}

在上面的示例中,MyServlet的doGet方法首先设置了一个属性到HttpServletRequest对象中,然后获取了一个RequestDispatcher实例,该实例将用于转发请求到/WEB-INF/result.jsp。最后,通过调用dispatcher.forward(request, response)方法,请求和响应被转发到指定的JSP页面。

应用领域

1.Web应用中的请求处理:在Web应用程序中,转发是一种常用的请求处理技术。当服务器收到客户端的请求后,可以根据请求的类型、参数等信息,将请求转发到相应的Servlet或JSP页面进行处理。这有助于实现请求的模块化处理和代码复用。
2.社交媒体传播:在社交媒体平台上,转发功能被广泛应用。用户可以转发他人的帖子、文章、视频等内容,将其快速传播给更多的用户。这种传播方式不仅提高了信息的传播速度,还增加了信息的曝光度和影响力。
3.新闻传播:在新闻领域,转发也是一种重要的传播方式。当有重大新闻事件发生时,各大媒体会发布相关报道,并通过转发功能将报道迅速传播给广大读者。这种传播方式有助于形成声势浩大的舆论场,增加新闻的传播效果和影响力。
4.公文处理:在政府机构和企业中,公文处理是一项重要的工作。其中,转发是一种常见的公文处理方式。例如,政府部门收到上级政府的通知后,可以将其转发给下级部门或相关单位,要求他们按照通知要求开展工作。这种转发方式有助于确保公文得到及时、准确的传达和执行。

重定向

定义

重定向指服务器接收到一个请求后,发现该请求需要访问另一个资源才能得到响应,于是告诉客户端重新发送一个请求,访问另一个资源。在这个过程中,客户端会重新发送一个请求,访问另一个资源,因此客户端会知道自己访问了两个资源。

图解

在这里插入图片描述

特点

1.简单直观:重定向是通过返回特定的响应状态码(如301、302)和Location头部来实现的,实现起来比较简单直观。这种方式可以明确告诉客户端需要重新发送请求到新的URL,客户端可以根据响应进行相应的处理。
2.客户端友好:重定向可以直接告诉客户端需要重新发送请求到新的URL,这使得客户端能够根据新的URL继续访问所需的内容。对于用户来说,重定向通常是无感知的,他们只会看到浏览器地址栏中的URL发生了变化。
3.数据共享性问题:重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了。

代码实现

import javax.servlet.*;  
import javax.servlet.http.*;  
import java.io.IOException;  
  
public class RedirectServlet extends HttpServlet {  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // 设置重定向的状态码,通常是302(临时重定向)或301(永久重定向)  
        response.setStatus(HttpServletResponse.SC_FOUND); // 302 Found  
        // 或者使用  
        // response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301 Moved Permanently  
  
        // 设置重定向的URL  
        String newUrl = "http://example.com/new-location";  
        response.setHeader("Location", newUrl);  
  
        // 实际上,使用sendRedirect方法更方便,它会自动设置状态码和Location头部  
        // response.sendRedirect(newUrl);  
  
        // 注意:在调用sendRedirect之后,不应该再对response进行任何输出  
        // 因为sendRedirect方法已经完成了重定向所需的全部工作  
  
        // 如果你使用了sendRedirect方法,那么下面的代码将不会被执行  
        // System.out.println("This line will not be executed if sendRedirect is called.");  
    }  
}

在上面的代码中,我提供了两种设置重定向的方法。第一种是手动设置状态码和Location头部,但更常见的是使用sendRedirect方法,因为它会自动为你完成这些设置。你只需要调用sendRedirect方法并传入新的URL即可。
注意,在调用sendRedirect方法后,你应该避免再对HttpServletResponse对象进行任何输出操作,因为重定向已经发送了一个完整的HTTP响应给客户端。如果你继续尝试输出内容,可能会抛出IllegalStateException异常。

应用领域

1.资源移动:当网站的资源位置发生变化时,可以使用重定向将旧的URL指向新的URL,以确保用户能够访问到正确的资源。
2.URL结构变化:当网站的URL结构发生变化时,如更换域名、调整路径等,可以使用301重定向将旧的URL永久地指向新的URL。这对于搜索引擎优化(SEO)非常重要,可以确保搜索引擎将旧的URL权重转移到新的URL上。
3.统一资源访问路径:当网站的资源存放在多个服务器上或使用了内容分发网络(CDN)时,可以使用重定向将所有的资源路径统一到一个URL,以简化网站维护和资源管理工作。
4.无效URL处理:当用户访问一个无效的URL时,可以使用重定向将用户导航到一个自定义的错误页面,显示友好的错误信息。这有助于提升用户体验。
5.避免重复请求:在Web应用中,有些操作(如修改服务器状态的请求)可能不希望用户由于刷新页面等操作而重复发送。这时可以使用重定向来避免重复请求,确保用户每次只执行一次操作。

转发与重定向区别

  • 请求转发
    1.浏览器只发出一次请求,收到一次响应
    2.请求所转发到的servlet2中可以直接获取到请求中所携带的数据
    3.浏览器地址栏显示的为用户所提交的请求路径
    4.只能跳转到当前应用的资源中
    5.速度较快,转发是在服务器内部进行的,不需要向客户端发送HTTP响应头,也不需要客户端重新发送一个请求,因此速度比重定向快
  • 重定向
    1.浏览器发出两次请求,接收到两次响应
    2.重定向到的servlet2不能直接获取到用户提交请求中所携带的数据
    3.浏览器地址栏显示的为重定向的请求路径,而非用户提交请求的路径。也正因为如此,重定向的一个很重要作用是:防止表单重复提交
    4.重定向不仅可以跳转到当前应用的其它资源,也可以跳转到到其它应用中资源
    5.速度慢,重定向需要向客户端发送HTTP响应头,并告诉客户端重新发送一个请求,因此速度较慢

表格展示

转发forward()重定向sendRedirect()
浏览器感知在服务器内部完成,浏览器感知不到服务器以302状态码通知浏览器访问新地址,浏览器有感知
浏览器地址栏不改变改变
整个过程发送请求次数一次两次
执行效率效率高效率慢
API(或发起者)Request对象Response对象
能否共享request对象数据不能
WEB-INF下的资源能访问不能访问
目标资源必须是当前web应用中的资源不局限于当前web应用
哪里跳转服务器端进行的跳转浏览器端进行的跳转
资源路径可以访问相对路径和绝对路径的资源只能访问绝对路径的资源

对比应用场景

1.若需要跳转到其它应用,则使用重定向。
2.若是处理表单数据的Servlet1要跳转到另外的Servlet2上,则需要选择重定向。为了防止表单重复提交。
3.若对某一请求进行处理的 Servlet 的执行需要消耗大量的服务器资源(CPU、内存),此时这个 Servlet 执行完毕后,也需要重定向。
4.其它情况,一般使用请求转发。

总结

转发和重定向都是网页跳转的方式,它们之间的区别主要在于可见性、速度、资源路径、请求次数和客户端处理等方面。转发对客户端是不可见的,速度比重定向快,可以访问相对路径和绝对路径的资源,只需要发送一次请求,客户端不需要进行任何处理。而重定向对客户端是可见的,速度较慢,只能访问绝对路径的资源,需要发送两次请求,客户端需要进行相应的处理。选择哪种方式取决于具体的需求和情况。
博主用心写,读者点关注;互动传真情,知识不迷路。

  • 60
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值