我正在使用 Struts 2 和 Spring Autowiring 。目前,默认策略设置为按名称,但通常我们使用构造函数,并且当只有一个实现类可用时,后备工作会在属性中 Autowiring 。
但是,我想将一个属性连接到一个具有多个实现类的操作类中,因此我将操作制作为一个 java bean,并将属性作为可以设置的字段。不幸的是,使用这些的唯一方法(显然)是它们有一个公共(public) getter/setter,这也会在请求时将它们暴露给类型转换器。换句话说,如果客户端将其名称作为表单字段或参数添加到请求中,Struts 将尝试将这些值写入其中。
所以我的问题是,实际上是否可以使用按名称 Autowiring 而不暴露这样的属性(这可能会或可能不会构成安全隐患),或者我最好只使用 XML 并将 Action 定义为对象有范围原型(prototype)吗?
最佳答案
我最终找到了 ParametersInterceptor
的文档。它实际上列出了三种限制拦截器设置参数的方法。
- 在参数配置中配置
excludeParams
,这是一个适用于所有操作的全局正则表达式(不是我想要的,也可能已弃用,因为它在最新的类文档中不再描述)。 - 设置
excludeMethods
(与之前的操作相同,是全局排除的首选方法) - 实现
ParameterNameAware
,这是最接近我想要的。您可以在此处将使用的参数列入白名单。
最后,在正常的 Spring 配置中将操作定义为原型(prototype)对象似乎是最谨慎的。让操作管理其拥有的参数意味着每次进行更改时都需要将参数显式列入白名单。
关于java - Struts2 + spring Autowiring 操作的名称而不暴露某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683101/