贴一下以前做的spring笔记,提供给大家学习~
Spring Interceptor&Filter
Interceptor(拦截器)
需要Springmvc支持,通过实现 HandlerInterceptor
接口,并在 WebMvcConfigurerAdapter
中 addInterceptors
注册拦截器绑定拦截路径实现对 Controller
的围绕通知或者拦截,比如判断用户登录情况、权限验证。
其中 preHandle()
方法在调用Handler之前进行拦截(下图步骤3), postHandle()
方法在视图渲染之前调用(下图步骤5), afterCompletion()
方法在返回相应之前执行
多个拦截器的执行顺序
多个拦截器它的执行顺序是和栈的入栈出栈顺序有点类似,我们把preHandle方法比作入栈,postHandle方法比作出栈,所以就是preHandle先执行的postHandle反而后执行。
Filter(过滤器)
通常用于过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理,同时也可进行逻辑判断。Filter不依赖与Springmvc,只需要依赖servlet,Filter随着Web应用启动。Filter是链式调用。
通过实现 Filter
接口,并在web配置中加入 FilterRegistrationBean
的Bean中进行注册。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class LogCostFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis(); filterChain.doFilter(servletRequest,servletResponse); System.out.println("Execute cost="+(System.currentTimeMillis()-start)); } @Override public void destroy() { } }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new LogCostFilter()); registration.addUrlPatterns("/*"); registration.setName("LogCostFilter"); registration.setOrder(1); return registration; } }
|
Filter和Interceptor的区别
- Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
- Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。