拦截器、过滤器

拦截器

概念:反射(动态代理)实现,对每个接口的请求进行拦截,比如校验接口请求的token是否有效。

springboot自定义拦截器,继承HandlerInterceptorAdapter

@Component
public class AuthorityInterceptor extends HandlerInterceptorAdapter {
    private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class);
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("进入到拦截器中:preHandle() 方法");
        System.out.println(request.getServletPath());
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("进入到拦截器中:postHandle() 方法中");
        System.out.println(request.getRequestURI());
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("进入到拦截器中:afterCompletion() 方法中");
        System.out.println(request.getServletPath());
    }
}

 

 注册拦截器,可以继承WebMvcConfigurerAdapter或实现 WebMvcConfigurer

@Configuration
public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private AuthorityInterceptor authorityInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
        //注册自己的拦截器并设置拦截的请求路径
        registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

 

自定义注解处理方法请求

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VerifyType {
    boolean isTrue() default true;
}
preHandle中设置成false将抛出异常
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("HelloInterceptor preHandle ");
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        VerifyType verifyType = handlerMethod.getMethodAnnotation(VerifyType.class);
        if (verifyType.isTrue()) {
            log.info("对的方法");
            return true;
        }
        log.info("错的方法");
        throw new Exception("错了--------");
    }

 

 

过滤器

 概念:函数回调实现,过滤请求,容器初始化时候使用。

 

在SpringBootApplication上使用@ServletComponentScan注解后,

Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

 

拦截器和过滤器区别:

1. 拦截器执行前的方法是preHandler是boolean类型,如果校验失败流程将会终止。 过滤器只有异常才会终止。(所以拦截器适合对接口合法性校验,校验不通过则不执行相应接口)

2. 过滤器 监听器  serverlet配置在web.xml ,是系统级的配置。拦截器配置在指定的配置文件,如spring的拦截器配置在spring.xml struts配置在struts.xml ,拦截器不是系统级的配置。

3. 过滤器在容器初始化和接口调用时候都会被调用,拦截器每个接口调用的时候才会使用。

4. 过滤器依赖servlet容器 , 拦截器不依赖servlet。

5. 过滤器需要每次filter.doFilter方法去调用,拦截器是方法执行前 中 后调用。

 

拦截器和过滤器执行顺序:

过滤前->拦截前->Action处理->拦截后->过滤后

 

 

参考文章:https://blog.csdn.net/reggergdsg/article/details/52962774

posted on 2022-02-09 20:35  周公  阅读(59)  评论(0编辑  收藏  举报

导航