Spring - 获取拦截器/过滤器

时间:2018-01-05 12:04:45

标签: java spring spring-mvc reflection annotations

我的@RequestMapping类中的各种@Controller方法都有我想在运行时分析的自定义注释。

E.g:

@Controller
@RequestMapping("/bla")
@RequireCommunityLevel("...")
@AnotherCustomAnnotation(value = "...")
public class FakeController {

    // ...
    @RequireScore(level = Score.Platinum, score = 8500)
    @RequestMapping("/blabla")
    @AnotherCustomAnnotation(value = "...")
    public DTOResponse<MySpecialModel> getMySpecialModels() {
        // ...
    }

}

当我在自定义InterceptorFilter课程中收到请求时,我想分析请求将要调用哪个Method

我过去曾使用基于Javax ServletJetty的自定义框架,并经常实施某种可以查询的方法 - 注册表

例如:

public class CustomFilter extends Filter {

    @Inject
    private MyMethodRegistry registry;

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

        // get the request path
        final String path = getPath(request); 

        final Method m = this.registry.getMethodForPath(path);

        // that's what I mean to do
        if (m.getAnnotation(RequireScore.class) != null) { ... }

        if (m.getDeclaringClass().getAnnotation(AnotherCustomAnnotation.class != null) { ... }

        chain.doFilter(request, response);
    }
}

我在Spring中寻找类似的方法,可能是一个内置的实用程序,可以在运行时分析Annotation方法上的@RequestMapping。所有这些都应该在我的Interceptor / Filter中发生。

1 个答案:

答案 0 :(得分:1)

正如@ M.Deinum在评论中建议您可以在Handler中获取Interceptor参数。

我还发现this tutorial可以解释我需要什么。

HandlerInterceptor::preHandle

final HandlerMethod handlerMethod = (HandlerMethod) handler; // the last parameter
final Method method = handlerMethod.getMethod();

// check for annotations