几个定义的理解

  1. 请求 响应

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

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

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

  1. 转发 重定向

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

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

java重定向后session还会再么_客户端

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

java重定向后session还会再么_node.js_02

转发只有一次请求,而重定向有两次请求(第一次返回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中存放的变量不会失效,就像把两个页面拼到了一起。