在尝试过滤器的时候牵扯到请求转发的场景,就顺手测试了一下。这里记录基本的使用套路。

1. 添加依赖

maven:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>

gradle:

// https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'

2. 测试代码

目标:不论是 forward 还是 redirect,最终是到达这个方法中。从请求中拿出 method 并打印出来。

  @GetMapping("/forward")public String filterForward(HttpServletRequest request,HttpServletResponse response){String method = request.getParameter("method");System.out.println("method: "+ method);return "hello "+ method ;}

请求转发:

(1) 这种请求转发方式是不 work 的。网上有好多这样的 demo,但我测试的时候都是直接返回了 forward:/forward 字符串。

  @GetMapping("/hello")public String helloFilter() {String hello = "hello filter \n";return "forward:/forward";}

(2)转发正确的打开方式。

  @GetMapping("/hello/forward")public void helloForward(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward?method=forward");requestDispatcher.forward(request,response);}

从代码中可以看出,请求转发是通过请求分配器( RequestDispatcher ) 直接将请求转发到了另一个 url 上。此时请求依旧在后端,还没有返回响应给前端。

重定向:

 @GetMapping("hello/redirect")public void helloRedirect(HttpServletRequest request,HttpServletResponse response)throws IOException {response.sendRedirect(request.getContextPath() + "/forward?method=redirect");}

从代码中可以看出,重定向是当前请求已经被 helloRedirect 执行完了,在 response 中”嵌入“新的 URL 并返回给前端。浏览器收到响应后会向嵌入的 URL 再发起一次请求,并将这次请求的结果渲染給用户。我测试了一把,当前端不是浏览器,而只是个 curl 命令,那么是不会有第二次请求的。

3. 转发和重定向的区别

最大的区别是:转发是有一次请求,重定向是两次请求。其他的区别点都是从这个点衍生来的。

转发:

  • 浏览器上的 URL 不会发生变化。
  • 原始的请求会发送到第二个 url 对应的方法中去。

请求:

  • 浏览器上的 URL 会发生变化。

  • 浏览器会创建一个新的请求发送给第二个 url 对应的方法。

4. demo 地址

forward-and-redirect

spring boot 请求转发和重定向相关推荐

  1. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等

    文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...

  2. SpringMVC第二讲——传参、修改端口、请求转发、重定向、跨服务器文件上传

    传参 在地址栏?代表开始传参,用&来分隔变量 /*** 请求参数-简单传参* @param name* @param age* @return*/@RequestMapping("t ...

  3. spring boot请求后缀匹配的操作

    这篇文章主要介绍了spring boot 请求后缀匹配的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 spring boot 请求后缀匹配 spring boo ...

  4. jsp:请求转发和重定向

    HttpServletResponse对象的sendRedirect(String location)方法称作重定向, 如果location地址前面加上"/",则表示相对于Serv ...

  5. 浅析请求转发和重定向

    浅析请求转发和重定向 1.请求转发 request.getRequestDispather("/indexServlet").forword(request,response); ...

  6. 【相对/绝对路径】JavaWeb项目中,请求转发与重定向的路径写法

    相对路径.全路径 是要不以/开头,都是相对路径.相对路径是从当前资源出发,去寻找其他资源. 只要路径中以/开肉,就是全路径.全路径是从项目根目录出发,去寻找其他资源. 在开发中,写文件路径时,最好使用 ...

  7. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  8. 【JavaWeb】Response请求转发与重定向辨析

    请求转发与重定向对比 辨析 请求转发只有一次请求.一次响应,是在服务端内部跳转 重定向有两次请求.两次响应:将结果返回给客户端,让客户端重新发起一次跳转 请求转发的登陆界面实现 login.jsp & ...

  9. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...

    原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...

  10. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

最新文章

  1. 基于双向LSTM和迁移学习的seq2seq核心实体识别
  2. linux安装python3.6以后报错处理
  3. vue-router向子组件传递参数
  4. 深度学习(1)---2017年深度学习NLP重大进展与趋势
  5. Linux命令sort的常用用法
  6. 深度学习(三)----算法岗面试题
  7. UISwitch用法详解
  8. py3 写的基于GUI 的 旁注 wwwscan集成扫描工具
  9. python+selenium实现QQ空间的登录
  10. 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(上)-计算机网络
  11. MFC动态修改Static Text控件caption
  12. 遍历文件夹进行点云格式转换 PCD转BIN BIN转PCD PCD转TXT TXT转PCD PLY转PCD
  13. 乐鑫ESP32-S3双核处理器,专为 AIoT 市场打造
  14. PyQt5编程-鼠标事件
  15. ShowType=0,交换机命令showinterfacestype0/port_#switchport|trunk用于显 - 信管网
  16. 计算机无法用630打印机,爱普生LQ-630型针式打印机突然打印几行乱码,就不工作了...
  17. Qt部分拉伸的背景图片
  18. java计算机毕业设计歌唱比赛积分管理系统源码+mysql数据库+系统+lw文档+部署
  19. 博客搬家到Octopress(Mac)
  20. 云和恩墨祝各位“女神”节日快乐!

热门文章

  1. MSM8937系统启动流程【转】
  2. paraview启动失败:failed to get wglChoosePixelFormatARB
  3. 完美解决Teamview12 过期之后不能用问题
  4. 中国各省所处的经纬度范围
  5. 黑苹果内置硬盘识别成外置硬盘_空间大?安全更重要,麦沃 K35274D硬盘阵列盒使用体验--数据无价...
  6. FPGA-08FPGAVGA彩条显示
  7. facade模式 java_Java设计模式之外观模式(Facade模式)介绍
  8. Visual Studio Ultimate 2012 激活密钥
  9. Intellij idea 2018.3热部署 jrebel 激活
  10. 三菱plc pwm指令_三菱plc功能指令集大全和自学基础