Forward 和 Redirect 的区别?
1 个回答
遇见错的人会消耗你,遇见对的人会治愈你。java小王子#### 1. 浏览器 URL 地址变化 - **Forward**: - **服务器内部的重定向**:服务器内部将请求转发给另一个资源(如另一个Servlet或JSP),浏览器的URL地址不会发生变化。 - **示例**: ```java request.getRequestDispatcher("/newResource").forward(request, response); ``` - **Redirect**: - **客户端重定向**:服务器响应客户端的请求并发送一个带有302状态码和新的Location头的响应,客户端浏览器会根据Location头的信息重新发起请求,浏览器的URL地址会变化。 - **示例**: ```java response.sendRedirect("/newResource"); ``` #### 2. 数据共享 - **Forward**: - **服务器内部请求转发**:在整个重定向过程中,`request`对象保持不变,因此可以在不同的Servlet或JSP之间共享`request`对象中的数据。 - **示例**: ```java request.setAttribute("name", "value"); request.getRequestDispatcher("/newResource").forward(request, response); // 在 newResource 的 servlet 中可以通过 request.getAttribute("name") 获取到 "value" ``` - **Redirect**: - **客户端重新请求**:由于是两次独立的HTTP请求,因此`request`对象不同,无法共享数据。如果需要在重定向后共享数据,可以通过Session或URL参数来传递。 - **示例**: ```java // 使用Session共享数据 request.getSession().setAttribute("name", "value"); response.sendRedirect("/newResource"); // 在 newResource 的 servlet 中可以通过 request.getSession().getAttribute("name") 获取到 "value" // 使用URL参数共享数据 response.sendRedirect("/newResource?name=value"); // 在 newResource 的 servlet 中可以通过 request.getParameter("name") 获取到 "value" ``` #### 3. 请求次数 - **Forward**: - **一次请求**:浏览器只发出一次请求,服务器内部完成请求的转发和处理。 - **示例**: ```java request.getRequestDispatcher("/newResource").forward(request, response); // 浏览器只发送一次请求,服务器内部处理转发 ``` - **Redirect**: - **两次请求**:浏览器发出一次请求,服务器响应302状态码并指定新的Location,浏览器根据Location再次发出请求。 - **示例**: ```java response.sendRedirect("/newResource"); // 浏览器发送两次请求,第一次请求服务器响应302状态码,浏览器根据Location再次请求 ``` ### 总结 - **Forward**:服务器内部重定向,URL地址不变,`request`对象数据共享,一次请求。 - **Redirect**:客户端重定向,URL地址变化,`request`对象不共享,两次请求。发布于 2024-08-08 19:52 •IP属地 青海举报评论收藏
公众号进入网站体验更佳

