>最近我一直在寻找如何在启动控制器逻辑之前更改HttpServletRequest
对象的标头和正文,我发现实现这一目标的唯一方法是使用一个方面,这个解决方案都很好,但问题是我有很多控制器类,我需要更改这些控制器中特定标头的值, 我已经在我的方面添加了我所有的课程:
@Pointcut("execution(* com.mypackage.Controller1..*(..)) || " +
"execution(* com.mypackage.Controller3.someMethod*(..))
//A lot of methods and packages
private void anyMethodWithHeader(){
@Around("anyMethodWithHeader()")
public ResponseEntity<Map<String, Object>> changeHeaderValue(ProceedingJoinPoint jp) throws Throwable{
//Here I got the object array with the arguments that I need
所以我的问题是:@PointCut
中有一种方法可以将正则表达式或条件或类似的东西放在一两行中,以获取特定的标头?
我的意思是,我有很多控制器,这些控制器接收很多标头,但我只想更改名为test-token
的标头的值,我想要的只是避免每次在我的项目中添加新控制器时在我的方面多添加一行。
我试图在我的方面和其他事情中添加@RequestHeader
包,但没有任何效果。
感谢您的评论。
你评论说:
@kriegaex我的所有类都在某个包下,它们是
@RestController
的,并且在其中许多类中,我在方法参数中都有一个必需的标头,例如:@RequestHeader(value = "my-header") String myHeader
你会得到@RestController
这样的所有类:
@within(org.springframework.web.bind.annotation.RestController)
您可以在某个包(及其子包(中获得所有类,如下所示:
within(a.certain.package..*)
您可以将其合并为
@within(org.springframework.web.bind.annotation.RestController) &&
within(a.certain.package..*) &&
execution(* *(..))
execution(* *(..))
部分在 Spring AOP 中不是必需的,因为它只支持方法执行连接点。在AspectJ中,您需要它,因为在那里您还可以拦截方法调用,构造函数和其他连接点。
如果您确实可以在所有目标方法中 100% 依赖@RequestHeader
参数注释,则可以使用
execution(* *(.., @org.springframework.web.bind.annotation.RequestHeader (*), ..))
并且还隔离注释及其值,如我在此处描述的请求正文(只需更改注释并根据需要调整其余代码(。
如果您可以依靠请求标头参数始终在签名中处于相同的相对位置,例如从左到右的第一个、第二个、第三个,那会更容易,因为您可以通过args()
直接将方法参数绑定到建议方法参数。如果是这种情况,请告诉我,我可以给你看一个例子。
可以将切入点设置为自定义注释,该注释仅用于您希望由方面处理的方法。除了应用方面时的精细控制之外,注释还可以具有方面本身使用的参数(有效地修改其行为(。
为了说明这个想法,这是我的一个小型项目,其中使用了它:
- 方面
- 注解
- 控制器
虽然方面在许多情况下功能强大且非常有用,但在这种特殊情况下,您也可以使用过滤器。