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'

0 ответов

Другие вопросы по тегам