【发布时间】:2020-01-21 07:51:53
【问题描述】:
最近我在寻找如何在启动控制器逻辑之前更改 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 的包,但没有任何效果。
感谢cmets。
【问题讨论】:
-
您的控制器方法有什么共同点,使它们与非控制器区别开来?某个基础包?命名模式?类上的
@Controller或@RestController注释?目标方法签名中的某些参数类型?如果有类似的东西,或者你可以重构来实现它(例如,将所有控制器移动到名为*..controller的子包中),我想我可以帮助你。 -
你为什么不考虑基于 HandlerInterceptor 的解决方案?docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
-
@kriegaex 我的所有类都在某个包下,它们是
@RestController,在许多这些类中,我在方法参数中有一个必需的标头,例如:@RequestHeader(value = "my-header") String myHeader -
@R.G 我尝试了该解决方案,但与过滤器遇到的问题相同,您可以获得请求的正文和标头,但您无法更改
HttpServletRequest的内容我尝试使用自定义对象仅处理标头(wilddiary.com/adding-custom-headers-java-httpservletrequest),但使用该解决方案您可以添加自定义标头但我无法更改现有标头的内容,我不想更改所有的逻辑我的课。
标签: java spring-boot aop