请求转发与重定向的理解

199 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

抛开名词的形容

首先,请求转发和重定向都可以做一样的事。它们都可以这样,比如说/a处理请求

  • 如果是请求转发,它是这样做的:request.getRequestDispatcher("/b").forward(request, response);
  • 如果是重定向,它是这样做的:response.sendRedirect("/b");

我们会发现,这俩的共性是/a它最终都需要把活丢出去。那么丢出这个面向的应用是不同的

请求转发

  1. 网站A今日正常的启动着,突然上头发了一个通知:今日23:59分,需要对网站进行升级,需要将一切的请求都先转发到,“维护升级页面”。

第一个描述的就是请求转发,一般涉及的是两个映射(RequestMapping)的转发。通常流程是: 客户端请求:/a,服务器/a接收到请求后,马上转发给/b,实际上干活的是/b。而在浏览器中用户看见的还是/a,这对用户的使用没有任何影响。重点:浏览器输入http://www.chengyunlai.top/a,本来可以看到/a当中的内容,但是页面维护,显示的是/b的内容,而URL不会改变,还是http://www.chengyunlai.top/a

请求转发的实现

// 请求转发
@GetMapping("/index")
public void toList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 页面维护,暂时将所有的首页请求转发到/juejin/error处理
    request.getRequestDispatcher("/juejin/error").forward(request,response);
}

重定向

  1. 输入用户名和密码,如果你输入对了,页面就需要进行跳转,如果这是前后端未分离的项目,通常是将前端和后端设置在一个工程中,这就需要后端控制页面的跳转了,与请求转发不同的是,重定向会改变URL,即用户在浏览器中看到的地址。重点:浏览器输入http://www.chengyunlai.top/a,请求完成后,需要重新定向到新的URL,http://www.chengyunlai.top/b

第二个描述的就是重定向,用户发送请求后,服务器会响应一个请求内容给客户端重新去访问。

重定向的实现

@GetMapping("/login")
public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 假设验证通过
    
    // 请求定向到/juejin/index
    response.sendRedirect(request.getContextPath() + "/juejin/index");
}