• 重定向和转发


    一、Redirect重定向

            重定向是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经改变了,麻烦使用新的URL再重新发送该请求。

            例如我们已经编写了一个能处理/hello的HelloServlet,如果收到的路径为/hi,希望能重定向到/hello,可以编写一个RedirectServlet:

    1. @WebServlet(urlPatterns = "/hi")
    2. public class RedirectServlet extends HttpServlet {
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. // 构造重定向的路径:
    5. String name = req.getParameter("name");
    6. String redirectToUrl = "/hello" + (name == null ? "" : "?name=" + name);
    7. // 发送重定向响应:
    8. resp.sendRedirect(redirectToUrl);
    9. }
    10. }

       如果浏览器发送GET  /hi请求,RedirectServlet奖处理此请求。由于RedirectServlet在内部有发送了重定向响应,因此,浏览器会收到如下响应:

    当浏览器收到302响应后,它会立刻根据Location的指示发送一个新的GET/hello请求,这个过程就是重定向

     

     由图可知:重定向有两种,一种是302响应,称为临时重定向;另一种是301,称为永久重定向。两者的区别是,如果服务器发送301永久重定向响应,浏览器会缓存到/mail到/buy这个重定向的关联,下次请求/mall的时候,浏览器就直接发送到/buy请求了。

     重定向的目的是当Web应用升级后,如果请求路径发生了变化,可以将原来的路径重定向到新路径,从而避免浏览器请求路径找不到资源。

    HttpServletResponse提供了快捷的redirect()方法实现302重定向。如果要实现301永久重定向,可以写为:

    resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301
    resp.setHeader("Location", "/mall");

    二、Forward转发

       Forword是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。 

        

       ForwordServlet在收到请求后,它并不自己发送响应,而是把请求和响应都转发给路径为/regiter的Servlet,也就是上述红色框圈出的。

       后续请求的处理实际上是由regiterServlet完成的。这种处理方式称为转发,流程图如下:

    三、总结

    转发和重定向的区别在于:
        转发:是在Web服务器内部完成的,对浏览器来说,它只是发出了一个Http请求,注意到使用转发的时候,浏览器的地址路径仍然是/Forword,浏览器并不知道该请求在Web服务器内部实际上做了一次转发。

    重定向:浏览器知道重定向规则,并且会自动发起一个新的Http请求。

  • 相关阅读:
    解决github无法访问,访问慢或者图裂问题
    Rancher 使用指南
    蓝牙芯片|瑞萨和TI推出新蓝牙芯片,试试伦茨科技ST17H65蓝牙BLE5.2芯片
    自动铣刀式分板机市场分析
    【Pandas数据处理100例】(七十五):Pandas的where()函数使用方法
    Apache Flink ML 2.1.0 发布公告
    详解Istio服务治理技术及环境搭建
    moudo网络库剖析
    JavaScript 中 toString 的奇妙使用
    制霸GitHub热榜的Spring Cloud Alibaba源码笔记,果然是阿里传出的
  • 原文地址:https://blog.csdn.net/qq_49194786/article/details/126406428