写点什么

filter、interceptor、aspect 不知如何选择,移动应用开发案例教程

用户头像
Android架构
关注
发布于: 刚刚

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



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



看看控制台的日志输出



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



控制台日志输出



停止应用后,控制台输出



Filter 随 web 应用的启动而启动,只初始化一次,随 web 应用的停止而销毁。


1.启动服务器时加载过滤器的实例,并调用 init()方法来初始化实例;2.每一次请求时都只调用方法 doFilter()进行处理;3.停止服务器时调用 destroy()方法,销毁实例。


我们再来看看 doFilter 方法


doFilter(ServletRequest request, ServletResponse response, FilterChain chain)


从参数我们看到,filter 里面是能够获取到请求的参数和响应的数据;但此方法是无法知道是哪一个 Controller 类中的哪个方法被执行。还有一点需要注意的是,filter 中是没法使用注入的 bean 的,也就是无法使用 @Autowired



上面代码注入的值为 null。这是为什么呢


其实 Spring 中,web 应用启动的顺序是:listener->filter->servlet,先初始化 listener,然后再来就 filter 的初始化,再接着才到我们的 dispathServlet 的初始化,因此,当我们需要在 filter 里注入一个注解的 bean 时,就会注入失败,因为 filter 初始化时,注解的 bean 还没初始化,没法注入。


如果一定你要使用,需要做一些处理,可以私信老顾哦

Interceptor 拦截器

依赖于 web 框架,在 SpringMVC 中就是依赖于 SpringMVC 框架。在实现上,基于 Java 的反射机制,属于面向切面编程(AOP)的一种运用,就是在一个方法前,调用一个方法,或者在方法后,调用一个方法。



在 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)



applyPreHandle 这个方法执行,就是执行的拦截器的 preHandler 方法,但这个过程中,controller 方法没有从 request 中获取请求参数,组装方法参数;而是在 ha.handle 这个方法的时候,才会组装参数


虽然没法得到方法的参数,但是可以获得 IOC 的 bean 哦。


再说明一点的是 postHandler 方法


postHandler 方法的执行,当 controller 内部有异常,posthandler 方法是不会执行的。


afterCompletion 方法,不管 controller 内部是否有异常,都会执行此方法;此方法还会有个 Exception ex 这个参数;如果有异常,ex 会有异常值;没有异常 此值为 null


注意点如果 controller 内部有异常,但异常被 @ControllerAdvice 异常统一捕获的话,ex 也会为 null

Aspect 切片

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




《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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



用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
filter、interceptor、aspect不知如何选择,移动应用开发案例教程