转发和重定向

本文详细解析了Java Servlet中请求转发和重定向的原理、用法,并比较了它们的异同,涵盖了request域、地址变化、范围限制和应用场景。

转发和重定向

// return "/site/admin/data"这种是返回到模板,
// 模板交给dispatchersevlet去后续处理
return "/site/admin/data";

// forward转发到另一个请求而不是模板,再继续处理;
return "forward:/data";

重定向的方法
response.sendRedirect(“list.jsp”);

转发方法
getRequestDispatcher()包含两个重要方法,分别是请求转发和请求包含。一个请求跨多个Servlet时,需要使用请求转发和请求包含。
首先需要获得一个RequestDispatcher 对象:RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
请求转发: rd.forward( request , response );
请求包含: rd.include( request , response);
需注意的是,无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!

 response.sendRedirect(request.getContextPath() + "/index");  //重定向到首页

 request.setAttribute("error", e.getMessage());  //转发时带入的信息
 request.getRequestDispatcher("/loginpage").forward(request, response); //转发

转发和重定向对比

  1. 请求转发是一个请求一次响应,而重定向是两次请求两次响应。
  2. 请求转发地址不变化,而重定向会显示后一个请求的地址。这是因为请求转发是服务器的行为,是由容器控制的转向,整个过程处于同一个请求中,因此客户端浏览器不会显示转向后的地址;但重定向是客户端的行为,重新发送了请求,整个过程不在同一个请求中,因此客户端浏览器会显示跳转后的地址。
  3. 请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目。
  4. 请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名。

在这里插入图片描述

request域

request是Java四大域对象之一,正是它提供了请求转发和请求包含的功能。一个请求会创建一个request对象,若在一个请求中跨越了多个Servlet,那么这些Servlet可以使用request来共享数据。**同一个请求范围内使用request.setAttribute()和request.getAttribute()来传值!**前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

参考链接 :转发重定向

### ### 概念区别 在 HTTP 协议中,**转发(Forward)****重定向(Redirect)**是两种不同的请求处理机制。它们的主要区别在于请求的处理流程、客户端是否感知以及数据传递方式等方面。 转发是一种服务器内部的操作,指服务器接收到请求后,将该请求委托给其他资源(如 Servlet、JSP 等)进行处理,整个过程在服务器端完成。对于客户端而言,这一操作是透明的,客户端并不知道请求转发到了其他资源。这种机制通常使用 `RequestDispatcher` 的 `forward()` 方法实现,在 Java Web 应用中较为常见[^4]。 与之不同的是,重定向是服务器通过发送特定的 HTTP 响应码(如 301、302)响应头中的 `Location` 字段,告知客户端需要重发起一个请求到另一个 URL。客户端会收到重定向的指令,并根据的 URL 再次发送请求。因此,重定向涉及两次独立的 HTTP 请求/响应交互。 ### ### 实现原理对比 在转发过程中,服务器将原始请求响应对象传递给目标资源,目标资源处理完成后将结果返回给服务器,再由服务器将响应返回给客户端。由于整个过程是在服务器端完成的,客户端浏览器地址栏显示的 URL 不会发生变化。 而重定向则是基于客户端行为实现的。当服务器决定执行重定向时,它不会直接返回最终内容,而是返回一个状态码 URL。客户端浏览器接收到响应后,会自动向的 URL 发起第二次请求,此时浏览器地址栏会更重定向后的 URL[^4]。 ### ### 数据传递方式 转发可以通过 `request` 对象携带属性信息,这些信息在整个请求范围内有效,因此目标资源可以获取到转发前设置的数据。这种方式适用于需要多个组件协作处理同一个请求的场景,例如权限验证之后转发到业务逻辑页面[^4]。 相比之下,重定向无法直接通过 `request` 对象传递数据,因为它是两个独立的请求。为了在重定向前后传递信息,通常采用 URL 参数、Cookie 或者 Session 的方式进行数据交换。例如,在 OAuth 授权流程中,服务端常常使用 `state` 参数来防止 CSRF 攻击,并确保请求来自原始发起方[^1]。 ### ### 用户体验差异 转发对用户是不可见的,浏览器地址栏始终显示最初请求的 URL,因此用户感知不到服务器内部的处理流程。而重定向会导致浏览器地址栏发生变化,用户可以看到跳转的过程,并且可以根据 URL 直接访问目标资源。这也意味着重定向具有更强的可书签性(bookmarkable),适合用于资源移动或页面跳转等场景。 ### ### 使用场景示例 转发常用于将一个请求分发给不同的组件进行处理。例如在一个 Web 应用中,将用户登录请求先由一个 Servlet 进行初步验证,然后转发给另一个 Servlet 进行具体的业务逻辑处理,这样可以保持 URL 的一致性并减少网络往返次数。 重定向则多用于用户登录成功后跳转到首页、资源移动到的 URL 后需要引导用户访问地址等场景。例如,用户注册成功后,重定向到登录页面让用户进行登录操作,或者在支付完成后跳转至订单详情页。此外,重定向也常用于防止表单重复提交,通过 PRG(Post/Redirect/Get)模式实现幂等性[^4]。 ### 示例代码 以下是一个简单的 Java Servlet 示例,展示转发重定向的不同效果: ```java // 转发示例 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("message", "This is a forwarded message."); RequestDispatcher dispatcher = request.getRequestDispatcher("/target.jsp"); dispatcher.forward(request, response); } // 重定向示例 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String redirectUrl = "https://example.com/new-location"; response.sendRedirect(redirectUrl); } ``` 在上述代码中,转发使用了 `RequestDispatcher.forward()` 方法,保留了原始请求上下文;而重定向通过 `HttpServletResponse.sendRedirect()` 方法触发客户端的请求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值