前言

项目中我们经常需要对RESTful api进行拦截,主流实现方法有filter、interceptor、aop,先说一下他们各自的实现。

Filter

AnimalFilter实现javax.servlet.Filter,项目启动时已初始化完成,可在控制台看到打印的初始化日志。

@Component
    public class AnimalFilter implements Filter {
     
        private Logger logger = LoggerFactory.getLogger(getClass());
     
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            logger.info("animalFilter 初始化。。。");
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            logger.info("animalFilter doFilter 。。。");
            chain.doFilter(request,response);//过滤器将请求往下传递
        }
     
        @Override
        public void destroy() {
            logger.info("animalFilter 销毁。。。");
        }
    }

如何调用不被component修饰的filter,将上文中的component注解去除,通过下文方式,让注解生效并设置注解生效的url请求地址信息。

@Configuration
    public class AnimalWebConfig {
     
        @Bean
        public FilterRegistrationBean animalFilter(){
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            AnimalFilter animalFilter = new AnimalFilter();
            filterRegistrationBean.setFilter(animalFilter);
            List<String> urlPattern = new ArrayList<>();
            urlPattern.add("/animal/getAnimalById/*");
            filterRegistrationBean.setUrlPatterns(urlPattern);
            return filterRegistrationBean;
        }
     
    }

由于filter获取的参数为ServletRequest request, ServletResponse response, FilterChain chain,无法知道是哪个类的那个方法调用,更无法知道调用时的参数。

Interceptor

首先编写一个AnimalInterceptor实现HandlerInteceptor方法,实现相应的三个方法,preHandle执行方法前执行返回的结果决定是否往下执行,postHandle当方法返回值时执行,afterCompletion无论成功或失败都将执行,前提是preHandler要返回true。

@Component
    public class AnimalInterceptor implements HandlerInterceptor {
     
        private Logger logger = LoggerFactory.getLogger(getClass());
     
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            String methodName = handlerMethod.getMethod().getName();
            logger.info("AnimalInterceptor:preHandle:methodName:" + methodName);
            logger.info("AnimalInterceptor:preHandle");
            return true;
        }
     
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            logger.info("AnimalInterceptor:preHandle:methodName:" + handlerMethod.getMethod().getName());
            logger.info("AnimalInterceptor:postHandle");
        }
     
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            logger.info("AnimalInterceptor:afterCompletion");
        }
    }

将写好的AnimalInterceptor注入到spring的interceptor注册中心即可

@Component
    public class InterceptorConfig extends WebMvcConfigurerAdapter{
     
        @Autowired
        AnimalInterceptor animalInterceptor;
     
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(animalInterceptor);
        }
    }

虽然interceptor可以知道调用的controller,调用的方法,但获取不到调用方法的参数。

AOP

编写AnimalAspect如下,可将传递的参数打印出来,aop拦截规则设置请查看,https://blog.csdn.net/FU250/article/details/80219415

@Aspect
    @Component
    public class AnimalAspect {
        private Logger logger = LoggerFactory.getLogger(getClass());
     
        @Around("execution(* com.imooc.security.demo.web.controller..*.*(..))")
        public Object handleAnimalController(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            Arrays.stream(proceedingJoinPoint.getArgs()).forEach(arg -> {
                logger.info("arg:"+arg);
            });
            logger.info("AnimalAspect");
            return proceedingJoinPoint.proceed();
        }
    }

三个拦截器的比较如下,根据自己的业务功能需求选择最合适的拦截器。


   

Spring 梳理 - filter、interceptor、aop实现与区别 -第一篇的更多相关文章

  1. spring boot: filter/interceptor/aop在获取request/method参数上的区别(spring boot 2.3.1)

    一,filter/interceptor/aop在获取参数上有什么区别? 1,filter可以修改HttpServletRequest的参数(doFilter方法的功能), interceptor/a ...

  2. Spring 梳理 - filter、interceptor、aop实现与区别 -第二篇

    spring mvc中的Interceptor可以理解为是Spring MVC框架对AOP的一种实现方式.一般简单的功能又是通用的,每个请求都要去处理的,比如判断token是否失效可以使用spring ...

  3. Filter ,Interceptor,AOP

    一.Filter: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. Spring整合AspectJ的AOP

    学而时习之,不亦说乎!                              --<论语> 看这一篇之前最好先看前面关于AOP的两篇. http://www.cnblogs.com/z ...

  5. Spring框架IOC和AOP介绍

    说明:本文部分内容参考其他优秀博客后结合自己实战例子改编如下 Spring框架是个轻量级的Java EE框架.所谓轻量级,是指不依赖于容器就能运行的.Struts.Hibernate也是轻量级的. 轻 ...

  6. Spring切面编程之AOP

    AOP 是OOP 的延续,是Aspect Oriented Programming 的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种 ...

  7. Spring的IOC和AOP之深剖

    今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...

  8. Spring(6)—— AOP

    AOP(Aspect-OrientedProgramming)面向切面编程,与OOP完全不同,使用AOP编程系统被分为切面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可 ...

  9. spring+mybatis利用interceptor(plugin)兑现数据库读写分离

    使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...

随机推荐

  1. Codeforces 936C

    题意略. 思路: 这个题目没做出来是因为缺少一个整体的构造思路. 正确的构造思路是不断地在s中去构造并且扩大t的后缀,构造好的后缀总是放在前面,然后不断地把它往后挤,最后将s构造成t. 比如: 现在在 ...

  2. [Python] Django框架入门2——深入模型

    说明: 本文主要深入了解模型(models.py),涉及ORM简介.模型定义.模型成员.模型查询.自连接等.需要一定基础,可以先走一走基本入门流程. 附录一使用mysql数据库,附录二Django开发 ...

  3. C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...

  4. Fiddle用于移动端抓包

    一.什么情况下可以用到 1.调查参考其他移动端网站的抓包,他们传输方式.如微信上京东的智能机器人的包.移动端的请求接口格式.如何实现的效果等. 2.调试本地移动端页面的测试页面效果是否有问题.如:页面 ...

  5. 【转载】Windows api数据类型

    最近在接触windows api函数,看到了很多之前没有看到过的数据类型,发现“个人图书馆”中有个帖子说的挺详细的,特地搬运过来 Windows 数据类型 Delphi 数据类型 描述 LPSTR P ...

  6. codeforces 872 D. Something with XOR Queries(思维)

    题目链接:http://codeforces.com/contest/872/problem/D 题意:给你一个排列p和对应的位置b也就是说p[b[i]]=i,然后给你最多询问2*n次找出所有的p排列 ...

  7. Atcode B - Colorful Hats(思维)

    题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_b 题解:挺有意思的题目主要还是模拟出最多有几种不可能的情况,要知道ai的差距不能超过1这个想想就 ...

  8. poj 2828--Buy Tickets(线段树)

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  9. lightoj 1245 Harmonic Number (II)(简单数论)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1245 题意:求f(n)=n/1+n/2.....n/n,其中n/i保留整数 显 ...

  10. dp递推题2010年吉林省省赛 1456: 逃票的chanming(3)

    1456: 逃票的chanming(3) 时间限制: 2 Sec  内存限制: 128 MB提交: 326  解决: 48[提交][状态][讨论版] 题目描述 这是一个神奇的国度.     这个国度一 ...