Zuul AspectJ на фильтрах
У меня есть простое приложение Spring MVC, которое находится за службой Zuul Gateway. Я создал простой фильтр, который проверяет, содержит ли входящий запрос поле заголовка Content-Type. Если он содержит его, он проходит через Zuul, но ничего не вернет, если в нем нет определенного поля. Этот фильтр расширяет ZuulFilter. В фильтре Zuul (пример кода ниже) я хотел бы, чтобы метод shouldFilter() регистрировался с аспектом (либо с помощью пользовательской аннотации, либо с помощью выражения pointcut метода). Все в комментариях выражений pointcut в совете внизу НЕ работало. Тем не менее, в аспекте выше, это работает, но он регистрирует все методы в классе, что я не хочу.
Мой Zuul фильтр:
public class TokenFormatFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER;
}
@Override
public boolean shouldFilter() {
RequestContext requestContext = RequestContext.getCurrentContext();
String ct = requestContext.getRequest().getHeader("Content-Type");
if (!(ct == null) && !ct.isEmpty()) {
return false;
}
return true;
}
@Override
public Object run() {
RequestContext requestContext = RequestContext.getCurrentContext();
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
// No need to return anything
return null;
}
}
Мой конфигурационный класс AspectJ:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AspectConfig {
@Bean
public LogAspect tracingLog() {
return new LogAspect();
}
}
Мой аспект (это работает правильно - просто я не хочу регистрировать все методы в этом классе, только конкретные методы):
@Component
@Aspect
public class LogAspect {
private static Logger log = LoggerFactory.getLogger(LogAspect.class);
@Before("execution(* edu.purdue.rhinh.zuulgateway.zuulconfig.TokenValidationFilter.* (..))")
public void timeExecution() {
log.error("THROWN");
}
}
Мой аспект (не работает правильно - ни одно из выражений pointcut комментариев не работает):
@Component
@Aspect
public class LogAspect {
private static Logger log = LoggerFactory.getLogger(LogAspect.class);
//@Before("execution(* edu.purdue.rhinh.zuulgateway.zuulconfig.TokenValidationFilter.shouldFilter())")
//@Before("execution(boolean edu.purdue.rhinh.zuulgateway.zuulconfig.TokenValidationFilter.* (..))")
//@Before("execution(public boolean edu.purdue.rhinh.zuulgateway.zuulconfig.TokenValidationFilter.shouldFilter() (..))")
//@Before("@annotation(logExceptionTrace)")
@Pointcut("execution(* edu.purdue.rhinh.zuulgateway.zuulconfig.TokenValidationFilter.*)")
public void timeExecution() {
log.error("THROWN");
}
}
Мои зависимости gradle.build (показаны не все, потому что много):
compile('org.springframework.cloud:spring-cloud-starter-zuul')
// AspectJ and AOP
compile group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '1.5.7.RELEASE'
compile group: 'org.aspectj', name: 'aspectjrt', version: '1.8.10'
compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.10'