首页
学习
活动
专区
圈层
工具
发布

filter、interceptor、aspect不知如何选择

再定义两个Controller,一个UserController,一个OrderController

虽然Filter过滤器和Controller请求都已经定义了,但现在过滤器是不起作用的。需要把Filter配置一下,有两个方案

第一个方案在Filter上面加上@Component

@Componentpublic class TimeFilter implements Filter

第二个方案配置化注册过滤器

第二个方案的特点就是可以细化到过滤哪些规则的URL

我们来启动应用时,过滤器被初始化了,init函数被回调

请求http://localhost:9000/order/1

看看控制台的日志输出

请求http://localhost:9000/user/1

控制台日志输出

停止应用后,控制台输出

在WebMvcConfigurationSupport配置一下

执行结果

我们发现拦截器中可以获取到Controller对象

preHandle(HttpServletRequest request,   HttpServletResponse response,   Object handler)

object handler就是controller方法对象

HandlerMethod handlerMethod = (HandlerMethod)handler;handlerMethod.getBean().getClass().getName(); //获取类名handlerMethod.getMethod().getName(); //获取方法名

但我们发现获取不到方法的参数值,这个是为什么呢?在DispatcherServlet类中,方法

doDispatch(HttpServletRequest request, HttpServletResponse response)

四、Aspect切片

AOP操作可以对操作进行横向的拦截,最大的优势在于他可以获取执行方法的参数,对方法进行统一的处理。常见使用日志,事务,请求参数安全验证

上面的代码中,我们是可以获取方法的参数的

虽然切面aop可以拿到方法参数,但拿不到response,request对象。

五、总结

我们这里来总结一下过滤器、拦截器、Aspect,看看区别

如果三者方式同时采用,那他们的执行顺序是什么呢?

filter -> interceptor -> ControllerAdvice -> aspect -> controller

返回值顺序,或异常返回顺序

controller -> aspect -> controllerAdvice -> Interceptor -> Filter

用一个图描述一下执行顺序

小伙伴们可以根据自身业务,和上面技术的各自特点,去选择相应的技术。今天老顾就介绍到这里,谢谢!!!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OZoJ9o1PgWaQITlIjcMklozA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券