Spring MVC 拦截器模式

Spring MVC Interceptor pattern

我有一个拦截器应该拦截具有不同模式的 url,例如:

我必须拦截所有包含 "add" 的网址。有很多 somethingssomethingelses...

我尝试了不同的模式,但似乎都是错误的:

拦截器类似于

public class MyInterceptor implements HandlerInterceptor {
}

我配置在

@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {                       
        registry.addInterceptor(getMyInterceptor()).addPathPatterns("**/add/*", "**/add/**", "**/add*");
    }

    @Bean
    public MyInterceptor getMyInterceptor() {
        return new MyInterceptor();
    }
}

如果我尝试访问

http://localhost:8080/myapp/something/add/somethingelse

我的拦截器没有拦截它...

显然这可以通过将 bean 类型更改为 "Mapped Interceptor" 并包装它来解决;尽管人们似乎并不知道为什么它首先是一个问题。

基于此解决方案:

我遇到了类似的问题。这是我的建议。

首先使用全局拦截器并检查请求uri:

public class MyInterceptor extends HandlerInterceptorAdapter {

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

        String uri = request.getRequestURI();

        if(uri.contains("/add")){
            // do your job
        }

        return super.preHandle(request, response, handler);
    }
}

在我的例子中,所有 add- 方法都是 PUTPOST 请求。所以我在我的全局拦截器中检查这个:

public class MyInterceptor extends HandlerInterceptorAdapter {

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

        String method = request.getMethod();
        if("PUT".equals(method) || "POST".equals(method)){
            // do your job
        }

        return super.preHandle(request, response, handler);
    }
}

不配置 addPathPatterns:

@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {
        registry.addInterceptor(getMyInterceptor());
    }

    @Bean
    public MyInterceptor getMyInterceptor() {
        return new MyInterceptor();
    }
}