首页 > 其他分享 >servlet的请求转发和响应重定向

servlet的请求转发和响应重定向

时间:2024-12-19 09:59:31浏览次数:5  
标签:请求 重定向 req 响应 转发 servlet 客户端

文章目录

1. 简介

请求转发(Request Forwarding):请求转发是指服务器端将请求从一个 Servlet 转发到另一个 Servlet、JSP 页面或 HTML 页面,整个过程在服务器内部进行,对于客户端来说,只发送了一次请求,地址栏的 URL 不会发生改变
响应重定向(Response Redirect):响应重定向是指服务器向客户端发送一个特殊的响应,告诉客户端重新发送一个新的请求到另一个 URL,客户端收到这个响应后,会自动向新的 URL 发送请求,这会导致地址栏的 URL 发生改变

2. 请求转发

特点:

  1. 通过HttpServletRequest对象获取请求转发器实现。
  2. 服务器内部行为,对客户端屏蔽。
  3. 客户端只发送一次请求,地址栏不变。
  4. 服务端产生一对请求和响应对象,传递给下一个资源。
  5. 请求参数和请求域数据可传递。
  6. 可转发给动态或静态资源,包括WEB-INF下受保护资源。
  7. 不能转发到本项目外的外部资源。

具体实现:

  • 通过DispatcherServlet类实现请求转发,设置请求属性并使用RequestDispatcher对象进行转发。

2.1 forword的请求转发

forward()方法用于在服务器端将请求从一个Servlet转发到另一个资源,允许第一个组件预处理请求,而让第二个组件处理并返回响应。

工作原理:

  • 当使用forward()方法时,请求完全交给目标资源处理,源组件不作出任何响应处理。
  • 请求对象和响应对象没有重新创建,而是传递给了目标组件。
  • 请求转发可以帮助完成页面跳转,可以转发至WEB-INF目录下的资源,但不能转发至外部资源。

特点:

  • 转发是服务器的行为,浏览器在转发过程中仅执行一次
  • URL不会改变
  • 可以携带数据,这些数据存储在request对象中。
  • 必须在HTTP响应被“确认”(即内容主体送回用户端)之前调用,否则将抛出IllegalStateException异常。
  • 调用后,原HttpResponse对象中的内容将被自动清除
RequestDispatcher dispatcher = req.getRequestDispatcher("/testzhujie");
dispatcher.forward(req, res);

我们做个测试:

@WebServlet(name = "RequestDispatcherTest", value = "/request-dispatcher-test")
public class RequestDispatcherTest extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        PrintWriter out = res.getWriter();
        out.println("<h1>" + "RequestDispatcherTest" + "</h1>");
        RequestDispatcher dispatcher = req.getRequestDispatcher("/testzhujie");
        dispatcher.forward(req, res);
        System.out.println("RequestDispatcherTest");

        out.println("<h1>" + "RequestDispatcherTest1111111" + "</h1>");
    }
}

@WebServlet(name = "TestZhujie",
        urlPatterns = "/testzhujie",
        loadOnStartup = 1, initParams = {
            @WebInitParam(name = "username", value = "yxz2"),
            @WebInitParam(name = "password", value = "123456")
})
public class TestZhujie extends HttpServlet {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write("...........zhujie");
    }
}

访问结果:
在这里插入图片描述

2.2 include的请求转发

include()方法用于在响应中包含另一个资源的响应内容,最终产生的响应并入原响应对象。

工作原理:

  • 当使用include()方法时,源组件包含目标组件,由源组件显示响应正文结果(还会把目标的响应结果包含进来)。
  • 服务器会将标准响应输出流开启,当前Servlet可以向输出流中写入数据,并且服务器还会将要转向的资源的输出流中数据合并到当前的输出流中
  • 目标资源对响应状态码或响应头的修改会被忽略。

特点:

  • 源Servlet与目标资源的输出数据都会被添加到响应结果中。
  • 目标资源对响应状态码或响应头的修改会被忽略。
  • 返回源Servlet的服务方法,继续执行后续代码。
  • 可以在新资源处理后继续处理原始请求

做个测试:

@WebServlet(name = "RequestDispatcherTest2", value = "/request-dispatcher-test2")
public class RequestDispatcherTest2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        PrintWriter out = res.getWriter();
        out.println("<h1>" + "RequestDispatcherTest222222222" + "</h1>");
        // 请求转发
        RequestDispatcher dispatcher = req.getRequestDispatcher("/testzhujie");
        dispatcher.include(req, res);
        out.println("<h1>" + "RequestDispatcherTest222222222" + "</h1>");
    }
}
@WebServlet(name = "TestZhujie",
        urlPatterns = "/testzhujie",
        loadOnStartup = 1, initParams = {
            @WebInitParam(name = "username", value = "yxz2"),
            @WebInitParam(name = "password", value = "123456")
})
public class TestZhujie extends HttpServlet {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write("...........zhujie");

    }
}

访问结果:
在这里插入图片描述

2.3 其他

对于WEF-INF中受保护的文件,也可以访问到。
在这里插入图片描述

@WebServlet(name = "RequestDispatcherTest2", value = "/request-dispatcher-test2")
public class RequestDispatcherTest2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // 请求转发
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/aaaa.html");
        dispatcher.include(req, res);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我是图图小淘气。。。
</body>
</html>

访问结果:
在这里插入图片描述

3. 响应重定向

响应重定向(Response Redirect) 是一种服务器通知浏览器去访问另一个URL的技术。与请求转发不同,重定向会导致客户端发起一个新的请求,因此浏览器的地址栏会显示新的URL。

响应重定向的特点:

  • 两次请求:重定向涉及两个独立的请求。客户端首先向服务器发送一个请求,然后服务器响应一个重定向指令,客户端根据这个指令再发送第二个请求。
  • 地址栏变化:由于重定向是由客户端执行的,因此客户端的地址栏会显示新的URL。
  • 不共享Request和Response对象:在重定向过程中,原始请求的HttpServletRequest和HttpServletResponse对象不会传递到新的资源。每个请求都是独立的。
  • 使用HTTP状态码:重定向通常使用状态码302 Found或303 See Other。

实现响应重定向的方法:
在Servlet中,可以使用HttpServletResponse对象来实现响应重定向。 主要方法是:

  • sendRedirect(String location):这个方法发送一个重定向响应到客户端,指示客户端访问另一个URL。调用这个方法后,原始Servlet的service方法应该立即返回,不应再对response对象进行任何写入操作。
@WebServlet(name = "RequestDispatcherTest2", value = "/request-dispatcher-test2")
public class RequestDispatcherTest2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // 重定向
        res.sendRedirect("/testServlet/testzhujie");
    }
}

访问后会跳转:
在这里插入图片描述
类似于拼接地址,所以对于WEF-INF中的文件不能访问。

4. 区别

  1. 请求次数:
    • 请求转发:仅涉及一次请求和一次响应。服务器内部将请求转发给另一个Servlet,客户端地址栏不会变化。
    • 响应重定向:涉及两次请求和两次响应。服务器向客户端返回一个重定向响应,指示客户端重新发送一个请求到新的URL,地址栏会显示新的URL。
  2. 地址栏变化:
    • 请求转发:地址栏保持不变,显示的是原始请求的地址。
    • 响应重定向:地址栏会变化,显示的是重定向后的URL。
  3. 范围限制:
    • 请求转发:只能在同一Web应用内进行资源跳转,目标地址必须是当前Web应用内的资源。
    • 响应重定向:可以跳转到任意URL,包括其他Web应用或外部资源。
  4. 数据共享:
    • 请求转发:转发过程中,request对象在同一请求范围内共享,可以在目标Servlet中获取到原始请求中的数据。
    • 响应重定向:由于涉及两次独立的请求,重定向后的请求无法直接获取到原始请求中的数据,通常需要通过session或其他机制传递数据。
  5. 行为性质:
    • 请求转发:是服务器端的行为,发生在服务器内部,客户端只感知到一次访问。
    • 响应重定向:是客户端的行为,服务器通过返回302状态码和Location头来指示客户端重新发送请求。
  6. 适用场景:
    • 请求转发:适用于需要在同一个Web应用内传递数据的场景,如前后端分离的应用中,前端页面需要跳转到后端处理逻辑并返回结果。
    • 响应重定向:适用于需要跳转到外部资源或改变客户端地址栏显示的场景,如登录成功后跳转到首页

5. 总结

无。。。。写的也算详细了,就不多说了。。

标签:请求,重定向,req,响应,转发,servlet,客户端
From: https://blog.csdn.net/weixin_51395608/article/details/144571517

相关文章

  • iOS 上使用 UTM 进行端口转发
     1.安装UTM: 首先确保你已经在iOS设备上安装了UTM,并且已创建并配置了虚拟机。无论你采用的什么系统,请首先安装Gemini.其次需要在IOS方和被访问方建立映射, 具体映射建立方式,参照介绍连接(2.目标客户端和访问端口),注意目前不建议使用dirct协议的映射. 2.配置虚拟机的......
  • 手动转发朋友圈太麻烦?快试试这个高效神器!
    面对朋友圈运营的种种挑战,你是否还在为频繁切换微信账号、复制文案和保存图片而烦恼?现在,有了这款高效神器——微信管理系统,一键转发朋友圈不再是梦。1、一键转发只需轻轻一点,系统便会自动复制内容,并跳转至发朋友圈的页面,免去了繁琐的复制粘贴步骤,既节省时间又方便快捷。2......
  • Linux shell的七大功能----输入\输出重定向、别名功能
    输入\输出重定向1.输出重定向输出重定向使用输出定向符“>”(覆盖) 和 ">>"(追加)例:echo‘123’>f1 catf1        查看f1的内容123          f1的内容如果没有f1文件则建立f1的同时将123写f1,如果有f1文件则用123覆盖其原......
  • RequestContextHolder 与 HttpServletRequest 的联系
    1.什么是RequestContextHolder?RequestContextHolder是Spring框架提供的一个工具类,用于在当前线程中存储和获取与请求相关的上下文信息。它是基于ThreadLocal实现的,能够保证每个线程独立存储和访问请求信息。与HttpServletRequest的关系:HttpServletRequest:是标准......
  • Oracle 应对 System 与 Sysaux 表空间不足难题 --转发:https://mp.weixin.qq.com/s/
    一、审计aud$表导致system用满1.进行相关常用检查的SQL--查看Oracle表空间大小SELECT a.tablespace_name "tablespace",total / (1024 * 1024 * 1024) "total(G)",free / (1024 * 1024 * 1024) "shengyu (G)",(total - free) / (1024 * 1024 * 1024) ......
  • 12.8 每日总结 (非Web环境中尝试获取HttpServletRequest对象Bug)
    今天的Bug解决吧SpringAI的底层函数回调并没有注册到Web容器中,所以要通过Controller层提前传递。 这个问题出现的原因是因为你在非Web环境中尝试获取HttpServletRequest对象,而这个对象是Web应用程序特有的,用于封装客户端发送的HTTP请求信息。在Spring框架中,HttpServletRequest......
  • Servlet介绍与配合javaWeb的使用
    文章目录1.Servlet介绍2.servlet的使用2.1创建项目2.2新建类2.3注册类2.4访问localhost:8080/myServlet.do2.5更简单的方式,使用注解(@WebServlet)2.6其他:修改欢迎页3.总结1.Servlet介绍Servlet是一种Java编写的服务器端程序,用于处理HTTP请求并生成动态Web内......
  • JavaWeb-2 Ajax以JSON格式访问Servlet
    1.客户端代码1<!DOCTYPEhtml>2<html>3<head>4<metacharset="UTF-8">5<title>Bootstrap实例-水平表单</title>6<linkrel="stylesheet"type="text/css"href="./css/boo......
  • Mysql端口转发实现跨服务器跨网络实现mysql访问
    端口可以通过Nginx进行转发,针对您提到的A、B、C三台服务器的网络状况和需求,可以通过Nginx在B服务器上配置端口转发,使得A服务器能够通过B服务器访问C服务器上的数据库。以下是实现这一目标的步骤:一、确认Nginx模块支持Nginx实现TCP端口转发,需要依赖stream模块。因此,需要确认Ngin......
  • Day32-JavaEE应用&Servlet路由技术&UDBC&Mybatis数据库&生命周期
    一,Servlet&路由&周期1,Servlet的含义:Servlet是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端请求和HTTP服务器上的数据库或应用程序的中间件。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页2.Servl......