转发与重定向(超详细)

转发与重定向(超详细)

一、概念

在Web开发中,转发(Forward)和重定向(Redirect)是两种常用的请求处理方式,它们用于将客户端请求从一个资源转移到另一个资源。

转发

转发是指服务器内部将请求从一个Servlet或JSP转交给另一个Servlet或JSP进行处理,而客户端对这种内部转移是不可见的。转发使用的是服务器端的资源,不会改变客户端的URL。

重定向

重定向是指服务器发送一个状态码和Location头给客户端,指示客户端重新发起一个新的请求到另一个URL。重定向会导致客户端浏览器的URL发生变化。

二、特点

转发的特点

  1. 单次请求:转发是在服务器内部完成的,客户端只发送一次请求。
  2. URL不变:客户端浏览器的URL保持不变。
  3. 高效:因为没有新的请求和响应的创建,所以转发的效率较高。
  4. 共享数据:可以使用request对象在转发前后的资源间共享数据。

重定向的特点

  1. 两次请求:重定向涉及两次请求和响应,第一次请求得到重定向指令,第二次请求重新请求新的URL。
  2. URL改变:客户端浏览器的URL会改变为新的URL。
  3. 不共享数据:因为是两个独立的请求,不能使用request对象在重定向前后的资源间共享数据。
  4. 适用场景:适用于需要告知客户端新的URL的情况,如处理表单提交后的跳转,防止表单重复提交。

三、转发与重定向使用

转发的使用

在Servlet中使用RequestDispatcher进行转发:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/source")
public class SourceServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求属性
        request.setAttribute("message", "Forward Example");
        
        // 转发请求
        RequestDispatcher dispatcher = request.getRequestDispatcher("/destination");
        dispatcher.forward(request, response);
    }
}

@WebServlet("/destination")
public class DestinationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求属性
        String message = (String) request.getAttribute("message");
        
        // 生成响应
        response.setContentType("text/html");
        response.getWriter().println("<h1>" + message + "</h1>");
    }
}

重定向的使用

在Servlet中使用response.sendRedirect进行重定向:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/source")
public class SourceServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置重定向URL
        response.sendRedirect(request.getContextPath() + "/destination");
    }
}

@WebServlet("/destination")
public class DestinationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 生成响应
        response.setContentType("text/html");
        response.getWriter().println("<h1>Redirect Example</h1>");
    }
}

四、转发与重定向的区别

1.重定向访问服务器两次,转发只访问服务器一次。

2.转发页面的URL不会改变,而重定向地址会改变

3.转发只能转发到自己的web应用内,重定向可以重定义到任意资源路径。

4、转发可以访问内部受保护的文件(WEB-INF)里的文件,而重定向不可以。
比较图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值