重定向(redirect)和请求转发(forward)

一、重定向(redirect)

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。
重定向是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL,重定向是客户端行为。

重定向工作流程:
重定向
简单示例:

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form method="post" action="/servlet1">
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" name="sub" value="提交">
    </form>
</body>
</html>

Servlet1:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author xy
 */
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        if(name.equals("zhang") && pwd.equals("zhang")) {
            //  重定向
            resp.sendRedirect("/success.html");
        }else {
            System.out.println("登录失败");
        }
    }
}

success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
</head>
<body>
登录成功
</body>
</html>

二、请求转发(forward)

请求转发(forward)是服务器请求资源,服务器直接访问目标地址的url,把响应的内容读取过来,再发送给浏览器。这个跳转时由服务器实现的,而不是在客户端实现的,所以客户端实际上并不知道这个跳转,地址栏显示的还是之前的URL,请求转发是服务器行为。

请求转发工作流程:
请求转发
简单示例:

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form method="post" action="/servlet2">
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" name="sub" value="提交">
    </form>
</body>
</html>

Servlet2:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author xy
 */
@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        if(name.equals("zhang") && pwd.equals("zhang")) {
            //  请求转发
            req.getRequestDispatcher("success.html").forward(req,resp);
        }else {
            System.out.println("登录失败");
        }
    }
}

success.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
</head>
<body>
登录成功
</body>
</html>

三、重定向(redirect)和请求转发(forward)的区别

区别重定向(redirect)请求转发(forward)
浏览器地址栏URL是否发生改变
是否支持跨域跳转
请求与响应的次数两次请求和两次响应一次请求和一次响应
是否共享request对象和response对象
是否能通过request域对象传递数据
速度相对要慢相对要快
行为类型客户端行为服务端行为
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值