重定向与请求转发

很好的一篇文章,让我一看就懂了,转了。

基础的东西,还是要打牢固的
response.sendRedirect(url)
request.getRequestDispatcher(url).forward(request,response)

response.sendRedirect(url) --
重定向到指定
URL
request.getRequestDispatcher(url).forward(request,response) --
请求转发到指定
URL

比如说有人打电话给公司前台找小王,这时候,公司的前台会有两种选择

一:通过转接的方式把电话转到小王那里(forward
二:通过告诉对方小王的电话号码的方式让对方打给小王(sendRedirect

涉及到电话挂断不挂断的问题
就像程序里面一样,请求是否有中断,决定参数是否能传递

response.sendRedirect(url)
跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参数,如:
url?id=1.
request.getRequestDispatcher(url).forward(request,response)
是直接将请求转发到指定URL,所以该请求能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而 sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
2....

redirect
会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的.

forward
发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面收到的request不是从浏览器直接发来了,可能己经放了数据.

 

补充一些

请求转发:

A.jsp通过request.getRequestDispatcher(“B.jsp”).forward(request,response)语句转发到了B.jsp,而B.jspforward到了C.jsp,这时的request依然是A.jsp中传递过来的request,也就是说请求并没有中断,C.jsp可以通过request获得来自A.jsp的数据。

重定向:

A.jsp通过response.sendRedirect(“B.jsp”)语句转发到了B.jsp,而B.jspforward到了C.jsp,这时的requestB.jsp新建的request,而不是A.jsp中传递过来的request,也就是说请求中断了,C.jsp不能通过request获得A.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` 关键字为止。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值