重定向与请求转发

本文详细阐述了重定向和请求转发两种Web开发中常见的页面跳转方式的区别。重定向涉及客户端两次请求,地址栏显示最终地址,无法传递request属性。请求转发仅涉及一次请求,地址栏显示初始地址,可传递request属性。

重定向

1,客户端浏览器向Web应用服务器端发送一个请求,Web服务器端将调用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;

2,客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户。

请求转发

请求转发指客户端浏览器向Web服务器端发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源,服务器端对该资源进行处理后反馈给客户端

区别

重定向:客户端向服务器发送一个请求后,请求地址将发生了变化,客户端接收到来自服务器的新地址后将自动访问该新地址,也即重定向中客户端和服务器将处理两次请求,请求的地址会被改变一次。

请求转发:客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
1,重定向无法在新的页面获取request.setAttribute中保存的数据,而请求转发可以;
2,请求转发在处理页面跳转时,跳转的新地址必须是本Web应用系统的资源,不可以是其他Web应用的资源。而重定向可以;
3,Web项目中WEB-INF文件夹非常安全,该目录内的资源只能通过请求转发获取,而重定向的方式无法获取;

实例

在这里插入图片描述
TargetServlet中代码如下:

public class TargetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("name","Tom");
		//重定向可以访问外网
		response.sendRedirect("http://www.baidu.com");
		//请求转发不可访问外网
		request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
		//重定向无法获取request.setAttribute("name","Tom");里的数据
		response.sendRedirect("http://www.baidu.com");
		//请求转发可以获取request.setAttribute("name","Tom");中的数据
		request.getRequestDispatcher("/WEB-INF/target.jsp").forward(request, response);
		
		
	}

要跳转到的/WEB-INF/target.jsp页面代码如下:
在这里插入图片描述

### 重定向请求转发的实现方式及区别 #### 实现方式 1. **重定向 (Redirect)** 在 Java Servlet 中,可以通过 `HttpServletResponse` 的 `sendRedirect()` 方法来实现重定向操作。此方法会向客户端发送一个新的 HTTP 响应,指示浏览器访问新的 URL 地址[^4]。 ```java @RequestMapping(value="/test/test01/{name}", method = RequestMethod.GET) public void test(@PathVariable String name, HttpServletResponse response) throws IOException { response.sendRedirect("/ceng/hello.html"); } ``` 2. **请求转发 (Forward)** 请求转发通过 `RequestDispatcher` 接口完成,服务器内部将当前请求对象传递给目标资源处理。这种方式不会改变客户端地址栏中的 URL[^3]。 ```java @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/target.jsp"); dispatcher.forward(req, resp); } ``` --- #### 区别分析 以下是两者的主要区别: 1. **HTTP 请求次数** - 重定向会触发两次 HTTP 请求:第一次是原始请求,第二次是由浏览器发起的新请求。 - 而请求转发仅涉及一次 HTTP 请求,在服务器端完成资源切换[^1]。 2. **URL 变化情况** - 使用重定向时,客户端浏览器的地址栏会被更新为目标 URL。 - 请求转发过程中,客户端看到的仍然是初始请求的 URL[^2]。 3. **数据共享能力** - 在请求转发中,可以利用 `HttpServletRequest` 对象在不同资源间共享数据(如设置属性)。 - 重定向由于涉及到两个独立的请求,无法直接共享数据,需借助 Cookie 或 Session 来保存信息。 4. **性能影响** - 因为重定向需要额外的一次网络交互,通常比请求转发消耗更多时间。 - 请求转发完全由服务器控制,效率更高。 5. **适用场景** - 如果希望用户感知到页面变化并能重新加载新页面,则适合采用重定向。 - 若只需在同一应用内快速跳转至另一资源而无需暴露具体路径细节,则优先考虑请求转发。 6. **后续代码执行行为** 不论是重定向还是请求转发,其后的代码均将继续运行直至函数结束或遇到 `return` 关键字为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值