开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
抛开名词的形容
首先,请求转发和重定向都可以做一样的事。它们都可以这样,比如说/a处理请求
- 如果是请求转发,它是这样做的:
request.getRequestDispatcher("/b").forward(request, response); - 如果是重定向,它是这样做的:
response.sendRedirect("/b");
我们会发现,这俩的共性是/a它最终都需要把活丢出去。那么丢出这个面向的应用是不同的。
请求转发
- 网站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);
}
重定向
- 输入用户名和密码,如果你输入对了,页面就需要进行跳转,如果这是前后端未分离的项目,通常是将前端和后端设置在一个工程中,这就需要后端控制页面的跳转了,与请求转发不同的是,重定向会改变
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");
}