请求转发和请求重定向都是 Web 应用中页面跳转的方式,但它们有以下几点不同:
- 重定向是客户端完成的,而转发是服务器端完成的;
- 请求转发浏览器地址不会改变,重定向浏览器地址会改变
- 请求转发是一次请求携带参数会保留,请求重定向是两次请求携带的参数不被保留
- 请求转发只能访问内部资源,请求重定向可以访问网络资源
下面分别通过代码示例来介绍这两种跳转方式。
请求转发示例:
// Servlet A
public class ServletA extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求转发到 ServletB 上
request.getRequestDispatcher("ServletB").forward(request, response);
}
}
// Servlet B
public class ServletB extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理请求
}
}
请求重定向示例:
// Servlet A
public class ServletA extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 将当前请求重定向到 ServletB 上
response.sendRedirect("ServletB");
}
}
// Servlet B
public class ServletB extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理请求
}
}
用户访问 Servlet A 时,它内部调用 response.sendRedirect("ServletB")
方法将请求重定向给 Servlet B 处理,这样浏览器会发送一个新的 HTTP 请求到 Servlet B,并且浏览器的 URL 会发生改变。在这种情况下,Servlet B 的路径是相对于应用根目录的。