消息转发

消息转发

请求转发

  • 定义:请求转发是指将客户端的请求从一个资源(如 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 实现
    • 可以直接定位到外部网站

实现:

  • 重定向通过 HttpServletResponsesendRedirect(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");
          }
      }
      
posted @ 2025-03-18 15:23  QAQ001  阅读(49)  评论(0)    收藏  举报