SpringMVC参数绑定

SpringMVC参数绑定是指将HTTP请求中的请求参数或请求体内容,根据Controller方法的参数,自动完成类型转换和赋值的过程。这样,Controller方法就可以直接使用这些参数,避免了需要编写大量的代码从HttpServletRequest中获取请求数据以及类型转换。

示例

以下是一个简单的示例,演示了如何使用SpringMVC参数绑定:

@Controller
public class UserController {
    @RequestMapping("/addUser")
    public @ResponseBody String addUser(User user) {
        return "OK";
    }
}

public class User {
    private String name;
    private Department department;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

public class Department {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

当请求为/addUser?name=test&department.name=SEC时,addUser方法中的user参数内容如下:

User{name='test', department=Department{name='SEC'}}

可以看到,name自动绑定到了User对象的name属性上,department.name自动绑定到了User对象的department属性的name属性上。

注意,SpringMVC支持多层嵌套的参数绑定。实际上,department.name的绑定是通过调用链实现的:

User.getDepartment()
Department.setName()

假设请求参数名为foo.bar.baz.qux,对应Controller方法入参为Param,则有以下的调用链:

Param.getFoo()
Foo.getBar()
Bar.getBaz()
Baz.setQux() // 注意这里为set

实现原理

SpringMVC实现参数绑定的主要类和方法是WebDataBinder.doBind(MutablePropertyValues)。该方法会根据Controller方法的参数类型,创建对应的JavaBean对象,并将请求参数绑定到JavaBean对象的属性上。具体实现过程如下:

  1. 通过反射创建Controller方法的参数类型的实例对象。
  2. 将请求参数转换为MutablePropertyValues对象。
  3. 调用WebDataBinder.bind(MutablePropertyValues)方法,将MutablePropertyValues对象绑定到JavaBean对象的属性上。
  4. 将JavaBean对象作为Controller方法的参数,传递给Controller方法。

在绑定属性值时,SpringMVC会根据属性的类型和名称,自动进行类型转换和赋值。如果属性是一个复杂类型(如Department),则会递归调用上述绑定过程,直到所有属性都被绑定完成。

需要注意的是,SpringMVC默认情况下会将请求参数名中的.转换为JavaBean对象属性的.,并将请求参数名中的_转换为JavaBean对象属性的_。例如,请求参数名为user.name,则会自动绑定到User对象的name属性上。如果需要修改这种转换规则,可以通过@InitBinder注解自定义WebDataBinder对象的属性编辑器

《Spring Framework RCE CVE-2022-22965漏洞复现报告》 11 SpringMVC参数绑定为了方便编程SpringMVC支持将HTTP请求中的的请求参数或者请求体内容根据Controller方法的参数自动完成类型转换和赋值。之后Controller方法就可以直接使用这些参数避免了需要编写大量的代码从HttpServletRequest中获取请求数据以及类型转换。下面是

原文地址: http://www.cveoy.top/t/topic/ghSf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录