转发和重定向

本文深入探讨了Servlet中两种核心请求处理方式:转发和重定向。通过具体代码实例,对比了两者在浏览器地址栏、request对象使用、API调用、处理位置、WEB-INF资源访问、请求域数据共享及目标资源方面的差异。

创建一个servlet类:

package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class Servlet2
 */斜体样式
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L; 
    public Servlet2() {
        super();
    }	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String header=request.getHeader("User-Agent");
		System.out.println("用户的浏览器信息:"+header);
		//1.重定向,告诉浏览器重新请求另一个资源
		/*用户发送Servlet2请求给服务器显示成功的页面,服务器告诉浏览器重新定位到新的资源,浏览器发送第二次请求,请求success.html页面,服务器响应*/
		//response.sendRedirect("success.html");
		//2.转发,服务器处理完成以后转交到另外一个资源。
		/*用户发送Servlet2请求给服务器显示成功的页面,服务器转发到success.html页面响应*/
		request.getRequestDispatcher("success.html").forward(request, response);
	}
}
//转发和重定的区别			转发			重定向
/*1.浏览器地址			不会发生变化,重定向发生变化
 *2.request				同一个请求		再次请求
 *3.API					request对象		request对象
 *4.位置					服务器内部完成	浏览器完成
 *5.WEN-INF				 可以访问		 不能访问
 *6.共享请求域数据		 可以共享		不能共享
 *7.目标资源		   当前web项目中的资源        不局限于当前web项目
 * */

首页:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是页面</h1>
<!-- http://localhost:8080/test/test.html -->
<a href="Servlet2">Servlet2</a>
</body>
</html>

响应页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>提交成功</h1>
</body>
</html>
### ### 概念区别 在 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、付费专栏及课程。

余额充值