javaweb入门(一)——servlet-07-Response实现重定向

重定向的概念

1.发送请求
2.通知A访问B
3.发送请求
4.返回响应
客户端
web资源A
web资源B

重定向客户端web资源A发送请求之后,web资源A通知客户端去访问web资源B,这个过程就是重定向。

我们需要注意的是重定向过程中客户端向服务器发送了两次请求,所以重定向之后的请求路径会发生改变,第一次请求发送给web资源B,在收到了B返回的响应之后,得知需要访问web资源C,之后又向web资源C发送请求。

重定向常见的应用场景:用户登录等等。

为了更加直观的了解重定向,我们可以做一个简单的案例。
案例步骤:

  1. 创建一个请求转发的servlet,将请求转发给我们上一章做的验证码案例
  2. 启动服务器测试

请求转发案例代码:

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    
    
package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.sendRedirect("radom");//我们如果输入的参数之前没有加‘/’,那么重定向的路径会是对应servlet路径
//        如果我们在输入参数之前加‘/’,那么我们重定向的路径是 localhost+输入的参数
//        resp.sendRedirect("/servlet_03_war/radom");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

案例结果:
在这里插入图片描述

我们需要注意的是,resp.sendRedirect()这个方法的参数可以是对应重定向servlet的相对于localhost的URL路径,也可以是对应servlet在项目内的URL路径,他们的区别是参数字符串是否以“/”开头。

重定向本质做的操作:

        resp.setHeader("Location","/r/img");
        resp.setStatus(HttpServletResponse.SC_ACCEPTED);

面试题:请聊聊重定向和请求转发的区别?

相同点:

  • 页面都会实现跳转

不同点:

  • 重定向的地址栏会发生变化,请求转发的地址栏不会发生变化
  • 重定向是请求发送给web资源A后,客户端接受到了返回的响应,并且根据获得的响应去向web资源B发送响应,整个过程中发送了两次请求。
  • 请求转发是客户端发送给web资源A,web资源A在接受到了请求之后,将请求转发给web资源B,web资源B处理完毕之后将响应返回给web资源A,web资源A在接受响应之后再将响应返回给客户端,整个过程中仅仅发送了一个请求。

重定向:

1.发送请求
2.通知A访问B
3.发送请求
4.返回请求
客户端
web资源A
web资源B

请求转发:

1.发送请求
3.转发请求
4.返回响应
4.将B返回的响应返回
客户端
web资源A
web资源B