1

最近我正在寻找如何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在我的方面和其他东西中添加包,但没有任何效果。

感谢您的评论。

4

2 回答 2

1

你评论说:

@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(). 如果是这种情况,请告诉我,我可以举个例子。

于 2020-01-20T23:51:53.227 回答
0

切入点可以设置为自定义注释,该注释仅用于您希望由方面处理的方法。除了应用方面时的精细控制之外,注释还可以具有方面本身使用的参数(有效地修改其行为)。

为了说明这个想法,这是我使用的一个小项目:


虽然方面在许多情况下都非常强大且非常有用,但在这种特殊情况下,您也可以使用过滤器

于 2020-01-17T22:45:08.123 回答