RequestDispatcher.forward() 与 HttpServletResponse.sendRedirect()

2023-11-21

之间有什么概念区别forward() and sendRedirect()?


在 Web 开发领域,术语“重定向”是指向客户端发送一个空的 HTTP 响应,其中仅包含一个Location标头包含客户端必须向其发送全新 GET 请求的新 URL。所以基本上:

  • 客户端发送 HTTP 请求到some.jsp.
  • 服务器发回 HTTP 响应Location: other.jsp header
  • 客户端发送 HTTP 请求到other.jsp(这会反映在浏览器地址栏中!)
  • 服务器发送回 HTTP 响应,内容为other.jsp.

您可以使用网络浏览器的内置/插件开发工具集来跟踪它。在 Chrome/IE9/Firebug 中按 F12 并检查“网络”部分即可看到。

上面的内容正是通过以下方式实现的sendRedirect("other.jsp"). The RequestDispatcher#forward()不发送重定向。相反,它使用目标页面的内容作为 HTTP 响应。

  • 客户端发送 HTTP 请求到some.jsp.
  • 服务器发送回 HTTP 响应,内容为other.jsp.

然而,由于原始 HTTP 请求是some.jsp,浏览器地址栏中的URL保持不变。此外,在后面的控制器中设置的任何请求属性some.jsp将在other.jsp。这在重定向期间不会发生,因为您基本上是在强制客户端创建一个newHTTP 请求开启other.jsp,特此丢弃原来的请求some.jsp包括它的所有属性。


The RequestDispatcher在 MVC 范例中和/或当您想要隐藏 JSP 以防止直接访问时非常有用。您可以将 JSP 放入/WEB-INF文件夹并使用Servlet它控制、预处理和后处理请求。 JSP 位于/WEB-INF文件夹不能直接通过 URL 访问,但Servlet可以使用访问它们RequestDispatcher#forward().

例如,您可以有一个 JSP 文件/WEB-INF/login.jsp and a LoginServlet它被映射到url-pattern of /login。当你调用http://example.com/context/login,然后 servlet 的doGet()将被调用。你可以在那里做任何预处理的事情,最后forward请求如:

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

当您提交表单时,您通常想要使用POST:

<form action="login" method="post">

这样servlet的doPost()将被调用,您可以在其中执行任何后处理操作(例如验证、业务逻辑、登录用户等)。

如果有任何错误,那么您通常需要forward请求返回同一页面并在输入字段旁边显示错误等。您可以使用RequestDispatcher为了这。

If a POST成功后,您通常想要redirect请求,以便当用户刷新请求时(例如按 F5 或导航回历史记录),不会重新提交请求。

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
    request.setAttribute("error", "Unknown login, please try again."); // Set error.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}

A redirect从而指示客户端触发一个新的GET对给定 URL 的请求。刷新请求只会刷新重定向的请求,而不刷新初始请求。这将避免“双重提交”以及混乱和不良的用户体验。这也称为POST-Redirect-GET pattern.

也可以看看:

  • Servlet 如何工作?实例化、会话、共享变量和多线程
  • Servlet 中的 doGet 和 doPost
  • 如何在JSP中执行验证并以相同的形式显示错误消息?
  • HttpServletResponse sendRedirect 永久
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RequestDispatcher.forward() 与 HttpServletResponse.sendRedirect() 的相关文章

  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • django管理员登录后重定向到另一个页面

    我正在 Django 中制作一个自定义管理页面 我不想重新发明轮子 因此想使用 Django 管理登录表单让员工登录并随后将他们重定向到 my url 但是 我无法找到在 admin 成功登录后将用户重定向到自定义网址的方法 因为我偶然发现
  • 从 servlet 向 applet 发送数据:我怎样才能实现这个?

    我要发送 发送HashMap反对请求它的小程序 servlet 具有这样的功能HashMap目的 我有办法做到这一点吗 Applet requests HashMap object gt Servlet listens to this re
  • 从 iframe 访问 Session 变量

    我有一个 jsp 我在其中设置了会话变量 但是 当我尝试读取另一个 jsp 中的会话变量 user 时 该变量已加载到 iframe 同一主机 服务器等 中 然后我得到 NullPointerException 如何在 iframe 中获取
  • 如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

    我有一个 Jersey RESTful Web 服务项目 我已经在中配置了 Jersey 容器web xml一切正常 在同一个项目中 我引入了一个 HTML 页面并包含在
  • 将java应用程序转换为jsp/servlet [重复]

    这个问题在这里已经有答案了 我有一个接受分段上传的java应用程序 我的问题是我想要一个HTML JSP前端 而不是仅仅在服务器上工作 根据我提供的代码 实现此目的的最佳方法是什么 这对我来说有点困惑 因为我不确定如何将文件上传部分带入 h
  • 表单提交后 Django 重定向不起作用

    Django 新手 所以这个可能有一个非常简单的答案 但我一生都找不到具体的解决方案 我只是想在使用 FileField 提交表单后重定向到新的 URL 我可以单独导航到该 URL 效果很好 文件上传正确 因此我知道它已正确验证 但重定向返
  • Tomcat 服务器向 servlet 发出 3 个请求

    下面是我的doGet method WebServlet name IndexServlet urlPatterns home initParams WebInitParam name sortBy value Constants POPU
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • JSP:未评估 EL 表达式[重复]

    这个问题在这里已经有答案了 我有一个在 Tomcat 5 5 上运行的 JSP 页面 我有以下代码
  • 迁移到 Jakarta EE:无法找到 URI 的 taglib [c]:[jakarta.tags.core] [重复]

    这个问题在这里已经有答案了 我尝试从 Spring 5 升级到 Spring 6 并收到以下错误 Unable to find taglib c for URI jakarta tags core 我的 pom 中有以下内容
  • HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

    这个问题在这里已经有答案了 我无法使页面正常工作 我有要发布的表单方法和我的 servlet 实现doPost 然而 它不断地向我表明我并不支持POST方法 我只是想做一个简单的网站并将值插入到我的 MySQL 数据库中 type Stat
  • 属性文件中的特殊字符

    在我的 Java Spring Web 应用程序中 我在打印从属性文件检索的意大利语特殊字符 等 时遇到问题 我找到了这篇文章http docs oracle com cd E26180 01 Platform 94 ATGProgGuid
  • ServletContext getContextPath()

    我检查了我的 Netbeans 项目中包含的 Tomcat 库的 javadoc 当我部署代码时工作正常 但是当我对我的 Web 项目进行全新构建时 我在 getContextPath 上收到 找不到符号 ServletContext接口的
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • JSP/Servlet HTTP 404 错误处理

    我想在我的网络应用程序中处理 HTML 404 错误 我可以这样写
  • 为什么我的 Github 托管网站响应 HTTP 302 而不是 200?

    我拥有该域名penkov id au http penkov id au 我主持一个blog http michael penkov id au blog 2014 01 02 reinventing the wheel html usin
  • java ee - 使用 servlet 对用户进行身份验证

    我刚刚开始学习java 还没有接触过java ee 我需要使用 servlet 来验证用户身份 请提供示例代码和技术文献 谢谢你 创建一个接受用户名 密码的 html 表单 将这些数据发布到 servlet 在 doPost 中读取这些数据
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 将非 www 和非 http 重定向到 https

    昨天我在服务器上安装了 SSL 从那以后我无法访问某些页面 www example com amsterdam shoes example com 阿姆斯特丹 两者都不会重定向到 https 甚至不会重定向到 http www exampl

随机推荐