消息转发
消息转发
请求转发
- 定义:请求转发是指将客户端的请求从一个资源(如 Servlet)传递到另一个资源(如另一个 Servlet 或 JSP 页面),由目标资源完成响应。
- 特点:
- 转发是服务器端行为,客户端不知道转发的发生。
- 转发过程中,请求对象(
HttpServletRequest)和响应对象(HttpServletResponse)是共享的。 - 转发后的 URL 不会改变,仍然是原始请求的 URL。
- 可以通过请求转发访问WEB-INF下的受保护的资源
- 请求转发请求的是该项目下的资源,所以不能直接定位到外部网站
实现
-
在 Java Web 中,请求转发通过
RequestDispatcher接口实现- 通过
HttpServletRequest的以下方法获取RequestDispatcher getRequestDispatcher(String path):path是目标资源的路径,可以是相对路径或绝对路径。- 绝对路径以
/开头,表示相对于当前 Web 应用的根目录。
- 通过
-
RequestDispatcher提供了两个方法:forward(ServletRequest request, ServletResponse response):- 将请求转发到另一个资源。
- 转发后,原始 Servlet 的响应会被清空,由目标资源生成响应。
include(ServletRequest request, ServletResponse response):- 将另一个资源的输出包含到当前响应中。
- 原始 Servlet 和目标资源的响应会合并。
示例:
-
import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class ServletA extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置请求属性 request.setAttribute("message", "Hello from ServletA"); // 获取 RequestDispatcher RequestDispatcher dispatcher = request.getRequestDispatcher("/servletB"); // 转发请求 dispatcher.forward(request, response); } } -
import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class ServletB extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取请求属性 String message = (String) request.getAttribute("message"); // 生成响应 response.getWriter().write("Message from ServletA: " + message); } }
重定向
定义:
- 重定向(Redirect)是 Web 开发中的一种常用技术,用于将客户端的请求从一个 URL 重定向到另一个 URL。与请求转发不同,重定向是客户端行为,涉及两次请求和响应。
- 重定向是指服务器向客户端返回一个特殊的响应(状态码 302),告诉客户端去访问另一个 URL。
- 特点:
- 重定向是客户端行为,客户端会发起新的请求。
- 重定向后,浏览器地址栏的 URL 会发生变化。
- 重定向涉及两次请求和响应,第一次请求由客户端发起,第二次请求由客户端根据服务器返回的 URL 发起。
- 重定向后,原始请求的数据不会自动传递到新请求中。如果需要传递数据,可以通过 URL 参数、Session 或 Cookie 实现
- 可以直接定位到外部网站
实现:
-
重定向通过
HttpServletResponse的sendRedirect(String location)方法实现-
response.sendRedirect(String location); -
location:目标 URL,可以是绝对路径或相对路径。- 绝对路径:以
/开头,表示相对于当前 Web 应用的根目录。 - 相对路径:相对于当前请求的路径。
- 绝对路径:以
-
-
import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class ServletA extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 重定向到 ServletB response.sendRedirect("/myapp/servletB"); } } -
直接重定向到外部网站
-
import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 重定向到外部网站 response.sendRedirect("https://www.google.com"); } }
-

浙公网安备 33010602011771号