重定向和请求转发的区别【小白看得懂】

一、请求转发与重定向区别

简单理解:
请求转发:当你要租房时,你去找中介,中介帮你找房源,你只向中介发起一次请求,中介将你的信息发送给挑剔的房东(请求转发中的请求所带的参数传递),房东同意租房,中介找到房源返回给你,房源是房东的,不是中介的,中介只是帮你找房东,最终你还是向房东租房(业务逻辑不是你请求的资源实现的)。

**重定向:**当你要租房时,你去问商店老板有房子租吗(向商店发一次请求),商店老板说没有剩余房子出租,但是隔壁应该有房子出租(重定向到隔壁),然后你又去隔壁询问(又一次发起请求),隔壁说有,你成功租到房子。

具体含义:
重定向:

  1. 可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求

  2. 当使用了重定向跳转页面后,在其客户端路径栏显示的应该是其重定向的路径,客户端是可以观察到页面地址变化的,重定向是客户端至少做了两次访问请求的

请求转发:

  1. 可以理解是服务器端行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起二次请求,无论这个请求经历过多少个处理程序,始终都是同一个请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用

  2. 中间传递的是自己容器的request,客户端的路径栏显示的还是第一次访问的路径,客户端是感觉不到服务器做了转发的,请求转发客户端是只做了一次请求。

设置重定向的两种方式

@WebServlet("/responseServlet")
public class ResponseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //方式一:使用状态码302与设置响应头Location来重定向
        response.setStatus(302);
        response.setHeader("Location","Servlet2");
        //方式二:使用response.sendRedirect()方法来重定向
//        response.sendRedirect("Servlet2");
        System.out.println("response");
    }
}

设置请求转发的方式:

@WebServlet("/requestServlet")
public class RequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过request对象的getRequestDispatcher()方法获得Servlet2的路径,在通过forward方法将参数传递给Servlet2
        request.getRequestDispatcher("Servlet2").forward(request,response);
    }
}

跳转页面Servlet2

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet2");
        response.getWriter().print("this is servlet2");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_16696457/article/details/108500266
今日推荐