springMVC中转发和重定向的简介及写法

转发与重定向的区别及详解

核心区别
特性 转发(Forward) 重定向(Redirect)
请求次数 1次(服务器内部跳转) 2次(客户端重新发起请求)
地址栏变化 不变化 变化
代码示例 request.getRequestDispatcher("/index").forward(request, response); response.sendRedirect("/webapp/index");
资源访问范围 可访问WEB-INF目录下的资源 无法直接访问WEB-INF目录下的资源
跨域/外部跳转 仅限服务器内部资源 支持跨域或外部资源跳转

详细说明
  1. 请求与响应流程

    • 转发

      • 客户端发送请求到AServlet,服务器内部转发到BServlet,最终返回响应。

      • 浏览器地址栏始终显示初始请求(如/a)。

    • 重定向

      • 客户端发送请求到AServlet,服务器返回302状态码和新地址(如/b)。

      • 浏览器自动发起第二次请求到新地址,地址栏显示/b

  2. 资源访问限制

    • WEB-INF目录下的资源(如JSP)对客户端隐藏,只能通过服务器内部转发访问。

    • 重定向由浏览器发起新请求,无法直接访问WEB-INF资源。

  3. 适用场景

    • 转发

      • 需要共享请求数据(通过request.setAttribute)。

      • 隐藏资源路径(如跳转到受保护的页面)。

    • 重定向

      • 防止表单重复提交(如提交后跳转到结果页)。

      • 跨域跳转(如从http跳转到https)。

总结:转发适合服务器内部资源跳转且需保留请求数据,重定向适合跨域或防止重复提交的场景。在Spring MVC中,合理使用配置可简化视图和静态资源管理。


在springMVC中如何完成转发和重定向

当return a 时候返回了一个逻辑视图名称,这种方式跳转到视图,默认采用的就是forward方式跳转

复制代码
@RequestMapping("/a")
    public String toA() {
        //重定向使用较多
        return "a";
    }

转发语法格式是什么

注: 底层创建的是InternalResourceView对象

java 复制代码
@RequestMapping("/a")
        public String toA() {
            //转发的时候格式有特殊要求
            //return "forward:转发到下一个资源的路径";
            //这个就不是逻辑视图名称了,是以转发的方式跳转是一个资源的路径
            return "forward:/b";
        }

重定向语法格式

注: 这是两次请求。底层创建的是RedirectView对象

javascript 复制代码
@RequestMapping("/a")
               public String toA() {
                   //重定向使用较多
                   //转发的时候格式有特殊要求
                   //return "forward:转发到下一个资源的路径";
                   //这个就不是逻辑视图名称了
                   return "redirect:/b";
               }

重定向跨域写全路径,例如:

javascript 复制代码
@RequestMapping("/springmvc")
               public String toB() {
                   //重定向使用较多
                   //转发的时候格式有特殊要求
                   //return "forward:转发到下一个资源的路径";
                   //这个就不是逻辑视图名称了
                   return "redirect:http://localhost:8088/springmvc2/b";
               }
相关推荐
孟陬1 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌1 小时前
一站式了解四种限流算法
java·后端·go
华仔啊2 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝2 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
Nyarlathotep01133 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen53 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java
SimonKing3 小时前
GitHub 10万星的OpenCode,正在悄悄改变我们的工作流
java·后端·程序员
Seven974 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
java
雨中飘荡的记忆14 小时前
ElasticJob分布式调度从入门到实战
java·后端