请求 响应 转发 重定向 cookie session

几个定义的理解

  1. 请求 响应

​ 请求:客户端向服务器端先发送一个信息,即请求报文,请求报文包含请求行 、请求头和请求体,如果是POST请求,在请求头和请求体之间还有空行。

​ 响应:服务器以一个状态行作为回应,响应内容由响应行、响应头、空行和响应体组成。

​ 一定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

  1. 转发 重定向

​ 转发是服务器的操作,重定向是客户端的操作。

​ 转发:当客户端向服务器请求访问A资源,但它没有A资源,它知道B那边有,于是服务器让客户端等一等,自己去把这个请求转发到B那边,最后服务器把从B 那边拿到的东西返回去;
在这里插入图片描述

​ 重定向:当客户端向服务器访问A资源时,服务器返回302状态码并在返回头中设置新的地址,客户端读取返回头信息中的地址再次访问新地址。
在这里插入图片描述

​ 转发只有一次请求,而重定向有两次请求(第一次返回302状态码,第二次返回200 ok),转发只能在站内转发,重定向可以随意定向。

一种比喻:

​ 转发:学生A去找老师T1解决问题,T1老师说他不会解决,我知道T2老师会解决,我去找他,后来T1老师就把结果告诉了学生A。

​ 重定向:学生A去找老师T1解决问题,T1老师说这个问题我解决不了,你去找T2老师,他会解决的!然后学生A就去找T2老师了,学生A拿到的是T2老师的结果。

  1. cookie session

Cookie:当客户端第一次给服务器发送一个请求时,服务器发现你没有Cookie:JSESSIONID,就在响应头里给你Set-Cookie: JSESSIONID=32位的随机数;后面客户端访问的时候,用服务器给你的Cookie作为通行证,就可以回到上次的请求页面。

Session:相当于程序在服务器上建立的一份客户档案,就是JSESSIONID=32位的随机数组成的列表,客户来访的时候只需要查询客户档案表就可以了。

牛客网一道题:

在Servlet里,能实现重定向的方法有()。

A.运用javax.servlet.http.HttpServletRequest接口的sendRedirect方法

B.运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法

C.运用javax.servlet.RequestDispatcher接口的forward方法

D.运用javax.servlet.ResponseDispatcher接口的forward方法

答案: B
解析:
A:javax.servlet.http.HttpServletRequest接口不存在sendRedirect方法
D:javax.servlet.ResponseDispatcher接口不存在forward方法

HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如 response.sendRedirect(“http://java.sun.com”)也可以使用相对的URL,是请求转发,前后页面共享一个request 。将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。
RequestDispatcher.forward()方法将当前的request和response重定向到该 RequestDispacher指定的资源。是重新定向,前后页面不是一个request。

大神说的:
重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择重定向。 转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

### 重定向请求转发的实现方式及区别 #### 实现方式 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` 对象在不同资源间共享数据(如设置属性)。 - 重定向由于涉及到两个独立的请求,无法直接共享数据,需借助 CookieSession 来保存信息。 4. **性能影响** - 因为重定向需要额外的一次网络交互,通常比请求转发消耗更多时间。 - 请求转发完全由服务器控制,效率更高。 5. **适用场景** - 如果希望用户感知到页面变化并能重新加载新页面,则适合采用重定向。 - 若只需在同一应用内快速跳转至另一资源而无需暴露具体路径细节,则优先考虑请求转发。 6. **后续代码执行行为** 不论是重定向还是请求转发,其后的代码均将继续运行直至函数结束或遇到 `return` 关键字为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值