当前位置:  开发笔记 > 后端 > 正文

RequestDispatcher.forward()vs HttpServletResponse.sendRedirect()

如何解决《RequestDispatcher.forward()vsHttpServletResponse.sendRedirect()》经验,为你挑选了3个好方法。

forward()和之间的概念差异是sendRedirect()什么?



1> BalusC..:

首先,术语"重定向"在Web开发世界中是向客户端发送空HTTP响应的动作,Location其中只有一个标题,其中客户端必须发送全新的GET请求.所以基本上:

客户端发送HTTP请求some.jsp.

服务器使用Location: other.jsp标头发回HTTP响应

客户端发送HTTP请求other.jsp(这反映在浏览器地址栏中!)

服务器发回HTTP响应,内容为other.jsp.

您可以使用webbrowser的内置/插件开发人员工具集来跟踪它.在Chrome/IE9/Firebug中按F12,然后选中"网络"部分进行查看.

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

客户端发送HTTP请求some.jsp.

服务器发回HTTP响应,内容为other.jsp.

但是,根据原始HTTP请求some.jsp,浏览器地址栏中的URL保持不变.


RequestDispatcher在MVC范例中非常有用,并且/或者当您想要隐藏JSP直接访问时.您可以将JSP放在/WEB-INF文件夹中,并使用Servlet哪些控件,预处理和后处理请求./WEB-INFURL不能直接访问文件夹中的JSP ,但Servlet可以使用它来访问它们RequestDispatcher#forward().

例如,你可以在一个JSP文件/WEB-INF/login.jspLoginServlet其上映射url-pattern/login.当您调用时http://example.com/context/login,doGet()将调用servlet .你可以在那里做任何预处理的东西,最后转发请求,如:

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

提交表单时,通常需要使用POST:

这样servlet doPost()将被调用,你可以在那里做任何后期处理(例如验证,业务逻辑,登录用户等).

如果有任何错误,那么您通常希望将请求转发回同一页面并在输入字段旁边显示错误,依此类推.你可以使用RequestDispatcher这个.

如果a POST成功,您通常需要重定向请求,以便在用户刷新请求时不会重新提交请求(例如,按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.
}

一个重定向从而指示客户端触发一个新的GET给定的URL请求.刷新请求只会刷新重定向的请求而不是初始请求.这将避免"双重提交"和混乱以及糟糕的用户体验.这也称为POST-Redirect-GET模式.


东西,最后
处理(例如验证,业务逻辑,登录用户等).

2> Abhijeet Ash..:

requestDispatcher - forward()方法

    当我们使用forward方法时,请求被转移到同一服务器内的其他资源以进行进一步处理.

    在转发的情况下,Web容器在内部处理所有进程,并且不涉及客户端或浏览器.

    当在requestdispatcher对象上调用forward时,我们传递请求和响应对象,因此我们的旧请求对象出现在将要处理我们的请求的新资源上.

    在视觉上我们无法看到转发的地址,它是透明的.

    使用forward()方法比发送重定向更快.

    当我们使用forward重定向并且我们想在新资源中使用相同的数据时,我们可以使用request.setAttribute(),因为我们有可用的请求对象.

的sendRedirect

    在sendRedirect的情况下,请求被转移到另一个资源到不同的域或不同的服务器以进行进一步处理.

    当您使用sendRedirect时,容器会将请求传输到客户端或浏览器,因此sendRedirect方法中给出的URL作为对客户端的新请求可见.

    在sendRedirect调用的情况下,旧请求和响应对象将丢失,因为它被浏览器视为新请求.

    在地址栏中,我们可以看到新的重定向地址.它不透明.

    sendRedirect较慢,因为需要一次额外的往返,因为会创建全新的请求并丢失旧的请求对象.需要两个浏览器请求.

    但是在sendRedirect中,如果我们想要使用,我们必须将数据存储在会话中或传递URL.

哪一个好?

它取决于哪种方法更有用的场景.

如果您希望控制转移到新服务器或上下文并将其视为全新任务,那么我们将转到发送重定向.通常,如果在浏览器重新加载网页时可以安全地重复操作不会影响结果,则应使用forward.

资源



3> Asaph..:

RequestDispatcher接口允许您执行服务器端转发/包含,而sendRedirect()客户端重定向.在客户端重定向中,服务器将发回HTTP状态代码302(临时重定向),这导致Web浏览器为GET重定向位置处的内容发出全新的HTTP 请求.相反,在使用RequestDispatcher接口时,新资源的包含/转发完全在服务器端处理.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有