对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

DataBinder

@Controller@ControllerAdvice类可以有@InitBinder方法 初始化WebDataBinder,而这些人反过来又可以:spring-doc.cadn.net.cn

  • 将请求参数(即表单或查询数据)绑定到模型对象。spring-doc.cadn.net.cn

  • 转换基于字符串的请求值(例如请求参数、路径变量、 标头、cookie 等)添加到控制器方法参数的目标类型。spring-doc.cadn.net.cn

  • 将模型对象值格式化为String呈现 HTML 表单时的值。spring-doc.cadn.net.cn

@InitBinder方法可以注册特定于控制器java.beans.PropertyEditor或 SpringConverterFormatter组件。此外,您可以使用 MVC 配置进行注册ConverterFormatter全局共享的类型FormattingConversionService.spring-doc.cadn.net.cn

@InitBinder方法支持许多相同的参数@RequestMapping方法 do,但@ModelAttribute(命令对象)参数。通常,它们被声明为 使用WebDataBinder参数(用于注册)和void返回值。 以下列表显示了一个示例:spring-doc.cadn.net.cn

@Controller
public class FormController {

	@InitBinder (1)
	public void initBinder(WebDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
	}

	// ...
}
1 定义@InitBinder方法。
@Controller
class FormController {

	@InitBinder (1)
	fun initBinder(binder: WebDataBinder) {
		val dateFormat = SimpleDateFormat("yyyy-MM-dd")
		dateFormat.isLenient = false
		binder.registerCustomEditor(Date::class.java, CustomDateEditor(dateFormat, false))
	}

	// ...
}
1 定义@InitBinder方法。

或者,当您使用Formatter通过共享的基于设置FormattingConversionService,您可以重复使用相同的方法并注册 控制器专用Formatter实现,如以下示例所示:spring-doc.cadn.net.cn

@Controller
public class FormController {

	@InitBinder (1)
	protected void initBinder(WebDataBinder binder) {
		binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
	}

	// ...
}
1 定义@InitBinder自定义格式化程序上的方法。
@Controller
class FormController {

	@InitBinder (1)
	protected fun initBinder(binder: WebDataBinder) {
		binder.addCustomFormatter(DateFormatter("yyyy-MM-dd"))
	}

	// ...
}
1 定义@InitBinder自定义格式化程序上的方法。

模型设计

在 Web 应用程序的上下文中,数据绑定涉及 HTTP 请求的绑定 参数(即表单数据或查询参数)添加到模型对象中的属性,以及 其嵌套对象。spring-doc.cadn.net.cn

public遵循 JavaBeans 命名约定的属性公开用于数据绑定 — 例如,public String getFirstName()public void setFirstName(String)方法firstName财产。spring-doc.cadn.net.cn

模型对象及其嵌套对象图有时也称为命令对象表单支持对象POJO(普通旧 Java 对象)。

默认情况下,Spring 允许绑定到模型对象图中的所有公共属性。 这意味着您需要仔细考虑模型具有哪些公共属性,因为 客户端可以面向任何公共属性路径,甚至是一些不预期的路径 针对给定用例。spring-doc.cadn.net.cn

例如,给定 HTTP 表单数据终结点,恶意客户端可以提供 存在于模型对象图中但不属于 HTML 表单的属性 在浏览器中显示。这可能导致在模型对象和任何 其嵌套对象的,预计不会更新。spring-doc.cadn.net.cn

建议的方法是使用仅公开的专用模型对象 与表单提交相关的属性。例如,在用于更改的表单上 用户的电子邮件地址,模型对象应声明一组最小的属性,例如 如下所示ChangeEmailForm.spring-doc.cadn.net.cn

public class ChangeEmailForm {

	private String oldEmailAddress;
	private String newEmailAddress;

	public void setOldEmailAddress(String oldEmailAddress) {
		this.oldEmailAddress = oldEmailAddress;
	}

	public String getOldEmailAddress() {
		return this.oldEmailAddress;
	}

	public void setNewEmailAddress(String newEmailAddress) {
		this.newEmailAddress = newEmailAddress;
	}

	public String getNewEmailAddress() {
		return this.newEmailAddress;
	}

}

如果您不能或不想为每个数据使用专用模型对象 绑定用例,您必须限制数据绑定允许的属性。 理想情况下,您可以通过setAllowedFields()方法WebDataBinder.spring-doc.cadn.net.cn

例如,要在应用程序中注册允许的字段模式,您可以实现@InitBinder方法@Controller@ControllerAdvice组件如下图所示:spring-doc.cadn.net.cn

@Controller
public class ChangeEmailController {

	@InitBinder
	void initBinder(WebDataBinder binder) {
		binder.setAllowedFields("oldEmailAddress", "newEmailAddress");
	}

	// @RequestMapping methods, etc.

}

除了注册允许的模式外,还可以注册不允许的模式 字段模式通过setDisallowedFields()方法DataBinder及其子类。 但请注意,“允许列表”比“拒绝列表”更安全。因此setAllowedFields()应该被青睐setDisallowedFields().spring-doc.cadn.net.cn

请注意,与允许的字段模式进行匹配区分大小写;而匹配 针对不允许的字段模式不区分大小写。此外,与 不允许的模式将不会被接受,即使它也恰好与 允许列表。spring-doc.cadn.net.cn

正确配置允许和不允许的字段模式非常重要 直接公开域模型以进行数据绑定时。否则,它是 巨大的安全风险。spring-doc.cadn.net.cn

此外,强烈建议您不要使用域中的类型 模型,例如 JPA 或 Hibernate 实体作为数据绑定场景中的模型对象。spring-doc.cadn.net.cn