JavaWeb-服务端转发和重定向

1 服务端内部转发

1.1 介绍

客户端向服务端发送一个request,服务端组件1接收到request后,经过处理,然后将request转发给服务端组件2,组件2也可以转发下去,这个过程称为服务端转发,最后组件2处理完后,返回给组件1一个response,组件1拿的这个response传给客户端。
因此这里组件1和组件2 共用一个 request和response

1.2 服务端内部转发代码

request.getRequestDispatcher("...").forward(request,response);
//一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道

1.3 值得注意的地方

  • 服务器内部转发的request和response是同一个

举个例子
客户端给服务器组件1发送一个request,服务器组件1收到request之后,在组件里进行处理然后把request转发给组件2,此时这个request仍然是客户端发来的request,且这个request的内容和客户端所发来的内容一致,就算组件一对request里面的内容做了修改,那么组件2收到组件1的request仍然是客户端传来的request且内容不变。最后组件二将response传给组件1,组件1传给客户端。

  • 代码验证
package com.atguigu.fruit.servlets;

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: 米兰的小铁匠
 * @Date: 2022/9/12 19:32
 * @Description: 服务端内部转发组件Demo01
 */
@SuppressWarnings("all")
@WebServlet("/Demo01")
public class Demo01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我是组件1");
        //给客户端发来的request设置一个信息 key=Confidence!
        request.setAttribute("key","Confidence!");
        //组件Demo01 转发给 组件Demo02
        request.getRequestDispatcher("Demo02").forward(request,response);
    }
}
---------------------------------------------------------------------------------------
package com.atguigu.fruit.servlets;

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: 米兰的小铁匠
 * @Date: 2022/9/12 19:33
 * @Description: 服务端内部转发组件Demo02
 */
@SuppressWarnings("all")
@WebServlet("/Demo02")
public class Demo02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我是Demo02");
        //获取组件Demo01转发来的request中设置的key
        String key = request.getParameter("key");
        //打印key看是否等于Confidence!
        System.out.println("key:" + key);
    }
}
  • 控制台打印结果
    *在这里插入图片描述
  • 这里发现key的值是null。可以看出 一开始客户端发送的request里没有给key设置值(一开始就没有key这个信息),虽然组件Demo01给key设置的值,但是传递给组件Demo02的request仍然是客户端所发送的request且里面的内容不变,所以得出结论 服务端内部转发的组件收到的 request是同一个request且里面的内容不变(就算某个组件修改了)。

1.4 示例图

在这里插入图片描述

2 重定向

2.1 介绍

客户端向服务器的一个组件发送来一个request,这个组件经过处理然后返回给客户端一个response,这个response告诉客户端要访问另外一个服务器组件,于是客户端开始向另外一个组件发送request,另一个组件收到request后开始进行处理。这个过程就是重定向。
因此这里要重新发送一个request,所以URL会发生变化这个两个组件所收到的request和发送的response是不一样的。

2.2 重定向转发代码

response.sendRedirecr("...");
//两次请求响应的过程。客户端肯定知道请求URL有变化
//客户端上面的地址栏有变化

2.3 示例图

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值