【问题标题】:Spring AOP - Pointcut Based on Value from Properties FileSpring AOP - 基于属性文件中的值的切入点
【发布时间】:2018-05-23 23:06:29
【问题描述】:

我正在使用 Spring AOP,我希望能够定义一个切入点,只要调用包内的方法(其名称在属性文件中定义)就会触发该切入点。也就是说,我的切入点看起来像

@Pointcut("within(${base.packageName}.*)")
public void MyPointCut() {}

然后如果我的配置文件有

base.packageName=foo.bar

那么在运行时切入点的行为就像这样

@Pointcut("within(foo.bar.*)")
public void MyPointCut() {}

我尝试了几种不同的方法(例如,在切入点表达式中使用 SpEL,配置实现静态切入点接口的类),但没有任何效果。

spring 有什么方法可以根据配置文件中的值定义切入点吗?

【问题讨论】:

  • 可以使用 XML aop config
  • 我不能赞成您的评论,但这非常有效。如果您想创建一个单独的答案,我会接受它;如果没有,那么我会用基本代码发布我自己的答案并相信你。谢谢

标签: java spring spring-aop


【解决方案1】:

这是不可能的,因为注释值必须是编译时常量表达式。因此,您的切入点无法解析 ${} 占位符,因为占位符解析发生在运行时。查看更多here

【讨论】:

  • 虽然注释参数必须是编译时常量,但没有什么能阻止库在运行时评估这些参数,就像 Spring 在您引用的问题中为 @Value 所做的那样。当然,这只有在运行时编织时才有可能,但您给出的原因并不能阻止它。
  • 您能否通过提供一个解释如何实现相同目标的示例来详细说明?谢谢。
【解决方案2】:

您不能这样做,这可能是设计使然。

我要在这里给你一些假设,我希望你考虑一下后果。

您要求能够为面向方面的构造动态定义一个值。您将其放置在未经验证的外部可访问源中。如果一个敌对者,在这里考虑安全性,要改变切入点并执行一些其他代码(可能甚至是任意的)你会认为安全吗?

AOP 虽然极具价值,但让大多数安全研究人员处于边缘地位。

【讨论】:

  • 我理解这个问题,但是我有两个问题: 1. 敌对者可能会改变值并任意定义切入点,但是他们无法执行另一段代码,因为切入点仍然只是调用我写的建议? 2、spring不是已经在某种程度上做到了这一点吗?不是所有的外部化配置都受到这个关注吗?无论如何,感谢您的回复,这是我没有想到的。
  • 1) 正确 - 考虑拒绝服务攻击 - 如果切入点更改为可能导致潜在攻击向量的过于激烈的表达式。 2) 是 - 但在一些较新的实例(spring-boot 的 configproperties)中,外部配置中的表达式仅限于属性扩展。不支持 SpEL。
  • 我试图支持您的评论,但我认为我没有足够的声誉(而且我确实支持了您的答案,但它只是不可见)。非常好的信息。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多