拦截器
实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。用于处理请求咱们Controller之前之后的的一些操作。
过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤
(拦截器既可以用于WEB,也可以用于Application、Swing中)
1 拦截器实现
主要步骤
- 定义拦截器:实现
HandlerInterceptor
,重写方法
- 注册拦截器:实现
WebMvcConfigurer
,添加@Configuration
- 定义拦截器
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{ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.printf("preHandle被调用\n"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle被调用\n"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion被调用\n"); } }
|
- 注册拦截器
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"); }
}
|
拦截的规则是支持通配符的,写法如下:
通配符 |
说明 |
* |
匹配单个字符,如/user/* 匹配到/user/a 等,又如/user/*/ab 匹配到/user/p/ab ; |
** |
匹配任意多字符(包括多级路径),如/user/** 匹配到user/a 、/user/abs/po 等; |
上述也可以混合使用,如/user/po*/**
、/user/{userId}/*
(pathValue是可以和通配符共存的);
注:
- Spring boot 2.0 后
WebMvcConfigurerAdapter
已经过时,所以这里并不是继承它,而是继承WebMvcConfigurer
;
- 这里在实操时,使用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
未完待续..
参考文献: