1.请求转发和请求重定向区别
请求转发和请求重定向主要区别,包含以下 5 点:
定义不同
请求方不同
数据共享不同
最终 URL 地址不同
代码实现不同
定义不同:🙌
请求转发:当服务器端收到一个客户端的请求之后,会先将请求转发给目标地址,再将目标地址返回的结果转发给客户端。而客户端对于这一切毫无感知的。
请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向。
请求方不同:🧨
请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端;而请求重定向是客户端的行为
状态码:请求转发:307
重定向:302
数据共享不同:🧇
请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的
最终 URL 地址不同:👌
请求转发是服务器端代为请求,再将结果返回给客户端的,所以整个请求的过程中 URL 地址是不变的;而请求重定向URL是会改变的
2.服务端内部转发案例
先写一个转发源servlet:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 服务端内部转发案例 */ public class ServerSideForwarding extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("服务端内部转发..."); req.getRequestDispatcher("ssfp").forward(req,resp); } }
req.getRequestDispatcher("ssfp").forward(req,resp);
这句话是转发给url为ssfp的servlet执行🍔
再写一个目的servlet:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 服务端内部转发目的地址 */ public class ServerSideForwardingPurpose extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是服务端内部转发目的地址..."); } }
xml文件配置如下:
<servlet> <servlet-name>ServerSideForwarding</servlet-name> <servlet-class>servlets.ServerSideForwarding</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServerSideForwarding</servlet-name> <url-pattern>/ssf</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServerSideForwardingPurpose</servlet-name> <servlet-class>servlets.ServerSideForwardingPurpose</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServerSideForwardingPurpose</servlet-name> <url-pattern>/ssfp</url-pattern> </servlet-mapping>
此时我们若访问url:ssp,控制台会输出:
服务端内部转发... 我是服务端内部转发目的地址...
成功实现服务端内部转发操作!🤪
3.客户端重定向案例
客户端重定向的例子很简单,只需要使用如下语句即可:
// 客户端重定向,重定向到路径ssfp resp.sendRedirect("/ssfp");