再定义两个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
用一个图描述一下执行顺序
小伙伴们可以根据自身业务,和上面技术的各自特点,去选择相应的技术。今天老顾就介绍到这里,谢谢!!!