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


    目录

    @PathVariable注解和redirect的作用

    使用场景

    返回值未命中

    返回值路径讲解


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

    @PathVariable注解和redirect的作用

    首先了解一下@PathVariable和redirect

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

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

    使用场景

    举个栗子:

    1. @RequestMapping("/original/{id}")
    2. public String originalMethod(@PathVariable String id) {
    3. // Do something with the 'id'
    4. return "redirect:/target/" + id;
    5. }
    6. @RequestMapping("/target/{id}")
    7. public String targetMethod(@PathVariable String id, Model model) {
    8. // Here you'll get the 'id' passed from the originalMethod
    9. model.addAttribute("id", id);
    10. return "targetPage";
    11. }

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

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

    返回值未命中

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

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

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

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

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

    举个栗子:

    1. @RequestMapping("/original")
    2. public String originalMethod() {
    3. // Do something with the 'id'
    4. return "redirect:/original";
    5. }

    返回值路径讲解

    1. @RequestMapping("/original")
    2. public String originalMethod() {
    3. // Do something with the 'id'
    4. return "redirect: /original";
    5. }
    1. @RequestMapping("/original")
    2. public String originalMethod() {
    3. // Do something with the 'id'
    4. return "redirect:original";
    5. }

    1.return "redirect:original";

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

    2.return "redirect:/original";

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

  • 相关阅读:
    测试员工作三年后的工资对比,没达到这个数的都属于拖后腿了
    浅述在线播放URL机制
    《结构化编程》— LED灯为例
    Java系列 | 如何讲自己的JAR包上传至阿里云maven私有仓库【云效制品仓库】
    IT运维管理平台助力企业打造监、管、控一体化
    vue3 的 ref、isRef、toRef、toRefs、toRaw 详细介绍
    字节跳动3-3大牛力荐!RabbitMQ实战指南:消息队列面试必刷手册
    AutoRunner4.5结合真实项目crm客户管理系统进行界面功能自动化测试教学资料(登录)
    【华为OD机试真题 python】数据分类【2022 Q4 | 200分】
    ELK日志分析系统
  • 原文地址:https://blog.csdn.net/m0_71507863/article/details/134099162