请求的重定向和请求分派

本文介绍了HTTP重定向与请求分派的概念及实现方式,并对比了两者之间的主要区别。同时,还介绍了如何通过请求域属性在组件间传递数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

请求的重定向和请求分派

重定向

–        HttpServletRequest接口提供的sendRedirect()方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,其完整的定义语法如下:

•         public void sendRedirect(String location) throws IOException;

–        其中的location参数指定了重定向的URL,它可以使用绝对URL和相对URL,Servlet容器会自动将相对URL转换成绝对URL后,再生成location头字段。

请求分派

–        Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:

•         public void forward(ServletRequest request, ServletResponse response)

•               throws ServletException,IOException;

•         public void include(ServletRequest request, ServletResponse response)

•               throws ServletException,IOException;

–        获取RequestDispatcher实例的方式主要有两种:

•         调用ServletContext接口提供的getRequestDispatcher(String url)方法。

•         调用ServletRequest接口提供的getRequestDispatcher(String url)方法。

重定向和请求分派的比较
HttpServletResponse的sendRedirect()方法实现的重定向和RequestDispatcher的forward()方法实现的请求转发的比较:

1、请求分派只能将请求转发给同一个Web应用中的其他组件;而重定向不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上。

2、重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

3、请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应”过程;而重定向的发起者和被调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程。

利用请求域属性传递对象数据

HttpServletRequest接口中提供了几个方法用来操作请求实例中存储的对象:

(1)public void setAttribute(String name, Object obj):将对象存储进HttpServletRequest实例中。

(2)public Object getAttribute(String name):检索存储在HttpServletRequest实例中的对象。

(3)public Enumeration getAttributeNames():返回包含HttpServletRequest实例中的所有属性名的Enumeration对象

(4)public void removeAttribute(String name):从HttpServletRequest实例中删除指定名称的属性。

### 关于重定向与转发的示例代码及其解释 #### 转发 (Forward) 转发是一种服务器端的行为,它通过 `RequestDispatcher` 接口实现。以下是转发的一个典型代码示例: ```java // 设置属性到请求对象中 request.setAttribute("message", "This is a forward example"); // 获取目标资源的分派器 RequestDispatcher dispatcher = request.getRequestDispatcher("/forwardExample.jsp"); // 执行转发操作 dispatcher.forward(request, response); ``` 在此代码片段中,`setAttribute` 方法用于向请求对象附加数据[^2]。这些数据可以在目标 JSP 页面中访问并展示。由于转发发生在服务器内部,因此浏览器中的 URL 不会发生变化[^3]。 --- #### 重定向 (Redirect) 重定向则是客户端的一种行为,通常涉及两次 HTTP 请求/响应周期。下面是一个简单的 Java Servlet 中执行重定向的例子: ```java String message = "This is a redirect example"; // 将消息存储在 session 中以便传递给下一个页面 session.setAttribute("message", message); // 发送重定向指令至指定 URL response.sendRedirect("/redirectExample.jsp"); ``` 在这个例子中,`sendRedirect` 方法被用来指示客户端发起一个新的请求指向 `/redirectExample.jsp` 地址[^4]。需要注意的是,在这种情况下,原始请求的数据无法直接传递到新的请求中,除非借助 Session 或其他机制保存临时状态信息[^1]。 另外还有一种更现代的方式利用 Spring MVC 提供的功能来进行带参数的安全重定向: ```java @Controller public class RedirectController { @RequestMapping("/exampleRedirect") public String handleRedirect(RedirectAttributes attributes){ // 添加闪存属性 attributes.addFlashAttribute("message","Using Flash Attribute for Secure Data Transfer."); // 返回视图名称加上 'redirect:' 前缀表示这是一个重定向动作 return "redirect:/targetPage"; } } ``` 这里展示了如何使用 `RedirectAttributes` 来安全地携带数据完成跨控制器方法之间的跳转[^4]。这种方式不仅保持了良好的用户体验同时也增强了系统的安全性。 --- ### 总结对比说明 | 特性 | 转发 (Forward) | 重定向 (Redirect) | |-------------------|------------------------------------|----------------------------------| | **发生位置** | 服务器内部 | 客户端 | | **URL 变化情况** | 浏览器地址栏不变 | 新的 URL 显示 | | **请求次数** | 单一请求 | 需要两个独立的请求 | | **数据共享方式** | 使用同一请求对象 | 数据需经由 Session 或重新提交表单等方式 | 以上表格清晰列出了两者的主要差异点[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值