拦截器的概念

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作

拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是方法调用,比如拦截敏感词汇、权限认证等。

拦截器的使用

自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。

public class AuthTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求前执行");

        boolean handleResult = false;
        String token = request.getHeader("token");
        if( token合法 ) {
            handleResult = true;
        }

        return handleResult;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("请求执行后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求结束后");
    }
}

在配置文件中注册定义的拦截器。

@Override
public void addInterceptors(InterceptorRegistry registry) {
    super.addInterceptors(registry);
    registry.addInterceptor(authTokenInterceptor()).addPathPatterns("/**");
//    List<String> urlPatterns = Lists.newArrayList();
//    urlPatterns.add("/**");
//    registry.addInterceptor(authTokenInterceptor()).addPathPatterns(urlPatterns);
}

@Bean
public AuthTokenInterceptor authTokenInterceptor() {
    return new AuthTokenInterceptor();
}

如果在拦截器中使用流读取参数,会导致controller注解中获取参数,可将流重新写入