如何在 Spring 3 MVC 中执行触发过滤器的 @CustomAnnotation 注释?

haw*_*eye 5 java spring spring-mvc spring-annotations

我想在 Spring 3 mvc 中做 @CustomFilter 注释,如下所示:

@CustomFilter
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(假设升级到 Spring 4 受到限制)目前我必须对 Spring 3 做的事情如下所示:

public class CustomFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        .... 
        chain.doFilter(req, res);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在 Spring 3 MVC 中执行触发过滤器的 @CustomAnnotation 注释?

fat*_*ddy 5

您可以使用HandlerInterceptor.

创建您的标记注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomFilter {
}
Run Code Online (Sandbox Code Playgroud)

创建一个HandlerInterceptor

public class CustomFilterHandlerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
        Exception {

        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            // Test if the controller-method is annotated with @CustomFilter
            CustomFilter filter = handlerMethod.getMethod().getAnnotation(CustomFilter.class);
            if (filter != null) {
                // ... do the filtering
            }
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

注册拦截器:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.example.CustomFilterHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>
Run Code Online (Sandbox Code Playgroud)


sha*_*zin 2

你必须明白的是,在Servlet规范中,Filters和Servlet是两个明确独立的组件,并且Filters是在Servlet之前调用的。

在您的情况下,您需要做的是拥有一个拦截器,如本文所述