一马平川
不积跬步无以至千里,后继才能薄发

Spring拦截器和过滤器

2021年03月13日
0
未分类

贴一下以前做的spring笔记,提供给大家学习~

Spring Interceptor&Filter

Interceptor(拦截器)

需要Springmvc支持,通过实现 HandlerInterceptor 接口,并在 WebMvcConfigurerAdapteraddInterceptors 注册拦截器绑定拦截路径实现对 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的区别

  1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
  2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
  3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
  4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
  5. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
  6. Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔