过滤器使用的是servlet的规范,依赖servlet应用容器。而拦截器是Spring的规范,内部是动态代理实现的,依赖spring mvc框架。
过滤器先于拦截器执行。请求从客户端发出后到达应用容器,然后首先执行过滤器链,过滤器链的执行顺序是web.xml中过滤器定义的顺序。所有过滤器都执行doFilter方法放行请求后,到达dispatcher servlet,然后获取handlerInterceptor 链和对应的handler。通过顺序执行拦截器interceptor的preHandler,如果每个preHandler都返回true,那么执行业务方法。然后在返回视图前执行postHandler,postHandler会接收modelandview,在postHandler中可以对modleAndView做处理。最后在返回视图后执行afterCompletion,业务方法执行异常时也会执行该方法。pre的顺序是正序,而post是倒序。
拦截器链中只要有一个拦截器的pre方法返回flase,则不会再执行后续的拦截器。业务方法/资源请求不会再执行。
过滤器中没有pre,post,afterCompletion等方法,只有一个dofilter方法,直接在dofilter方法中对请做处理或执行filterchain的doFilter方法放行请求。
过滤器是在web.xml中定义的,需要配置过滤器的实现类以及过滤的请求url。过滤的请求url可以是精确匹配,路径匹配,后缀匹配。优先级由高到低。最低的是/,匹配所有路径。/*是路径匹配的一种,所以优先级会比/更高,也是匹配所有的请求。
拦截器是spring mvc的规范,所以定义在spring的配置文件中,使用<mvc:>去配置相关的配置项。
过滤器中可以拿到request和response对象以及过滤器链对象
拦截器中pre方法中可以获取request,response自己对应handler对象(如handlermethod或者处理静资源的handler)
相关参考文章:
tomcat关于配置servlet的url-pattern的问题详解:
https://www.cnblogs.com/sogeisetsu/p/12950699.html
SpringMvc servlet 拦截器 过滤器关系和区别及执行顺序:
https://www.cnblogs.com/Jomini/p/13839743.html
HandlerInterceptor和MethodInterceptor :
https://blog.csdn.net/tjbsl/article/details/105256291
网友评论