Java登陆第二十九天——请求转发和响应重定向

发布时间 2023-12-25 01:15:38作者: ocraft

请求转发响应重定向都是间接访问项目某资源的手段

请求转发

顾名思义,是客户端请求的转发,所以此方法是HttpServletRequest的一个方法

方法 描述
RequestDispatcher getRequestDispatcher(String var1) 获取请求转发对象,var1是资源地址
RequestDispatcher方法 描述
void forward(ServletRequest var1, ServletResponse var2) 请求转发

image

  • 请求转发特性

    • 可以访问静态资源(html)和动态资源(servlet)

    • 因为请求、响应对象是同一个,所以参数会被保留

    • 请求转发是面对服务器的,客户端并不知晓请求被转发了

    • 可以访问WEB-INF中的信息

    • 不能将请求转发到外部项目(不是本项目的项目)

请求转发栗子

TestServlet4

@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问了Test4");
        RequestDispatcher rd = req.getRequestDispatcher("Test4B");
        //直接把Test4的请求、响应对象传给Test4B
        rd.forward(req,resp);
    }

TestServlet4B

@WebServlet("/Test4B")
public class TestServlet4B extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问了Test4B");
        //不能访问本项目之外的项目。
        RequestDispatcher rs = req.getRequestDispatcher("www.baidu.com");
        rs.forward(req,resp);
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4

//控制台输出
访问了Test4
访问了Test4B

然后报错?(因为不能访问外部项目)

image

访问WEB-INF下资源

a.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是WEB-INF下a.html
</body>
</html>

image

TestServlet4

@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问了Test4");
		//访问受保护资源
        RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/a.html");
        rd.forward(req,resp);
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4

image

响应重定向

顾名思义,是服务端响应的重新定位,所以此方法是HttpServletResponse的一个方法

方法 描述
void sendRedirect(String var1) 服务器重定向到新URL

image

  • 响应重定向特性

    • 可以访问静态资源和动态资源

    • 请求、响应对象不算同一个,无法保留参数

    • 响应重定向是面对客户端的,客户端知晓

    • 无法访问WEB-INF中的信息(可以把重定向当作一次新的请求)

    • 可以重定向至外部项目(因为是一次新的请求,等于去请求了外部项目而已)

响应重定向栗子

TestServlet4

@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问了Test4");
        resp.sendRedirect("Test4B");
    }
}

TestServlet4B

@WebServlet("/Test4B")
public class TestServlet4B extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问了Test4B");
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4

//控制台输出
访问了Test4
访问了Test4B

image