《Spring之拦截器、过滤器》
2022-09-22 22:42:56

拦截器

实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。用于处理请求咱们Controller之前之后的的一些操作。

过滤器

依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤

(拦截器既可以用于WEB,也可以用于Application、Swing中)

1 拦截器实现

主要步骤

  • 定义拦截器:实现HandlerInterceptor,重写方法
  • 注册拦截器:实现WebMvcConfigurer,添加@Configuration
  1. 定义拦截器
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
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
* 拦截器
*/
public class MyInterceptor implements HandlerInterceptor{
//在请求处理之前进行调用(Controller方法调用之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.printf("preHandle被调用\n");
return true;
}

//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle被调用\n");
}

//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion被调用\n");
}
}
  1. 注册拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class MvcConfig implements WebMvcConfigurer {

/**
* 注册拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/a.do");
// 这里的拦截器是new出来的,在Spring框架中可以交给IOC进行依赖注入,直接使用@Autowired注入
// addPathPatterns 用于添加拦截的规则,excludePathPatterns 用于排除拦截的规则
}

}

拦截的规则是支持通配符的,写法如下:

通配符 说明
* 匹配单个字符,如/user/*匹配到/user/a等,又如/user/*/ab匹配到/user/p/ab
** 匹配任意多字符(包括多级路径),如/user/**匹配到user/a/user/abs/po等;

上述也可以混合使用,如/user/po*/**/user/{userId}/*(pathValue是可以和通配符共存的);

注:

  1. Spring boot 2.0 后WebMvcConfigurerAdapter已经过时,所以这里并不是继承它,而是继承WebMvcConfigurer
  2. 这里在实操时,使用IDEA工具继承WebMvcConfigurer接口时,使用快捷键Alt+Enter已经无论如何没有提示,进入查看发现这个接口中所有的方法变成了default方法(JDK8新特性,这个修饰符修饰的方法必须要有方法体,此时接口中允许有具体的方法,在实现该接口时,用户可以选择是否重写该方法,而不是必须重写了),所以没有提示,可以手动进入接口中复制对应的方法名(不包括default修饰符)。

2 过滤器实现

SpringBoot中使用过滤器不需要在web.xml中配置filter,只需要

  • 添加注解@WebFilter
  • 实现Filter接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Component
@WebFilter(urlPatterns = "/*", filterName = "test")
public class TestFilter implements Filter {

@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.printf("过滤器实现");
System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void destroy() {
System.out.println("过滤器销毁了");
}

}

3 应用场景

可以参考:https://blog.csdn.net/xiaoyaotan_111/article/details/53817918

未完待续..


参考文献:

Prev
2022-09-22 22:42:56
Next