当前位置: 首页 > article >正文

redirect导致的循环重定向问题(史上最全)

目录

@PathVariable注解和redirect的作用

使用场景

返回值未命中

返回值路径讲解


起因:#记录一下学习编程遇到的最难受的一个bug

@PathVariable注解和redirect的作用

首先了解一下@PathVariable和redirect

在Spring框架中,@PathVariable 注解主要用于提取 URI 模板中的变量

redirect: 是在Spring MVC控制器方法中使用的特殊前缀,用于执行重定向。有相对路径和绝对路径之分,如果有/则代表绝对路径

使用场景

举个栗子:

@RequestMapping("/original/{id}")
public String originalMethod(@PathVariable String id) {
    // Do something with the 'id'
    return "redirect:/target/" + id;
}

@RequestMapping("/target/{id}")
public String targetMethod(@PathVariable String id, Model model) {
    // Here you'll get the 'id' passed from the originalMethod
    model.addAttribute("id", id);
    return "targetPage";
}

上面的代码在执行的时候,会先进入originalMethod方法,返回的时候它会重新请求target下的URL路径,也就是执行一次targetMethod方法,和我们直接跳转到页面是有区别的,比如我们需要对页面进行赋值,如果没有重新执行后端方法,那么就会出现空白页的现象

因此:我认为redirect重定向主要是为了重新发起一次http请求执行我们的后端业务,一般情况下只会执行一次

返回值未命中

那么问题出现了,如果返回值没有命中,类似于下面的场景

@RequestMapping("/original/{id}")
public String originalMethod(@PathVariable String id) {
    // Do something with the 'id'
    return "redirect:target";
}

那么当你访问 /original/123,此方法会被调用,然后它会重定向到相对路径 target。如果你没有提供一个完整的路径(比如 /target),那么它会被解释为相对于当前请求URL的路径。所以它会尝试重定向到 /original/target

如果 /original/target 路径恰好与另一个控制器方法匹配,那么那个方法会被调用。就不会发生死循环问题

但如果 /original/target 路由与 originalMethod 方法匹配,会导致无限重定向循环,因为它会不断地调用自己。

举个栗子:

@RequestMapping("/original")
public String originalMethod() {
    // Do something with the 'id'
    return "redirect:/original";
}

返回值路径讲解

@RequestMapping("/original")
public String originalMethod() {
    // Do something with the 'id'
    return "redirect: /original";
}
@RequestMapping("/original")
public String originalMethod() {
    // Do something with the 'id'
    return "redirect:original";
}

1.return "redirect:original";

这是一个相对重定向。当你在当前URL路径下进行这样的重定向时,它会添加到当前路径。例如,如果你当前的URL是 /somepath/original,此重定向将尝试导航至 /somepath/original/original

2.return "redirect:/original";

这是一个绝对重定向。不论当前URL是什么,它都会导航至应用的根目录下的 /original。也就是说,它始终导向到 /original


http://www.kler.cn/a/108039.html

相关文章:

  • 【Qt-ROS开发】使用 Qt Creator 构建和编译含 ROS 库的 Qt 项目
  • 【vue2.0入门】vue单文件组件
  • [HarmonyOS]简单说一下鸿蒙架构
  • JUC-locks锁
  • Typescript类型运算符、关键字以及内置高级类型
  • Apache ECharts
  • 使用反射调用类的私有内部类的私有方法
  • lvs+keepalived: 高可用集群
  • PHP 同城服务共享茶室小程序系统是如何实现的?
  • C语言二、八、十六进制转换
  • 【Apache Flink】实现有状态函数
  • 2023年马丁·加德纳聚会数学魔术分享之《不只是奇偶性的魔术》回顾
  • Android 13.0 根据包名授权悬浮窗权限
  • CSS宽度100%和宽度100vw之间有什么不同?
  • windows PC virtualBox 配置
  • 【计算机网络笔记】Web缓存/代理服务器技术
  • 用Visual Studio(VS)开发UNIX/Linux项目
  • excel巧用拼接函数CONCAT输出JSON、SQL字符串
  • Powershell脚本自动备份dhcp数据库
  • 僵尸网络|让人防不胜防的内部网络安全问题,作为企业IT不得不了解的基础安全
  • 酷开科技 | 酷开系统大屏电视,打造精彩家庭场景
  • Blueprints - 虚幻中的行为树(Behavior Tree)
  • 排序算法-堆积树排序法(HeapSort)
  • SQL企业微信群机器人消息推送
  • 关于数据中台的理解和思考
  • 实战经验分享FastAPI 是什么