
学习参考博客:
彻底搞懂过滤器、拦截器、监听器、AOP,看这一篇就足够了
基础知识还是不够扎实,参考大佬博客学习了一波。以下为学习笔记
是sevlet 中的一种常用技术,本质上就是一个 实现了 Filter接口的 Java类。
使用步骤(springboot 环境下):
1,实现 Filter接口(javax.servlet 包下)并重写其 3个方法;
2,设置过滤器名称、及需要过滤的资源路径;
例:设置一个叫 testFilterName的过滤器,过滤拦截系统内所有资源路径;
@WebFilter(filterName = “testFilterName”, urlPatterns = “
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("初始化过滤器1");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("------进入过滤器1------");
HttpServletResponse response = (HttpServletResponse) servletResponse;
//模拟 过滤条件 1==1
if(1!=1){
responseJson(response,"当前请求不合法!");
return;
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
log.info("xxxxxx销毁过滤器1xxxxxx");
}
private void responseJson(HttpServletResponse response, Object data) {
response.setContentType("application/json;charset=utf-8");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter writer = response.getWriter();
// 消除对同一对象循环引用的问题,默认为false,不设置 SerializerFeature.DisableCircularReferenceDetect 数据可能会乱码
writer.write(JSON.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect));
writer.close();
response.flushBuffer();
} catch (IOException e) {
log.error("【输出 JSON 异常】,{}", e);
}
}
}
拓展问题:
1,设置多个过滤器的过滤顺序?
默认是按照过滤器的类名字母先后顺序,或是数字大小依次调用的。
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean pathFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter3());
registrationBean.addUrlPatterns("
@Log4j2
@Component
public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long l = System.currentTimeMillis();
log.info("--拦截器1 请求执行前处理 开始--");
log.info("--拦截器1 请求执行前处理 结束共耗时:"+(System.currentTimeMillis()-l));
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long l = System.currentTimeMillis();
log.info("--拦截器1 请求完成后处理 开始--");
log.info("--拦截器1 请求完成后处理 结束共耗时:"+(System.currentTimeMillis()-l));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long l = System.currentTimeMillis();
log.info("--拦截器1 视图渲染完成后处理 开始--");
log.info("--拦截器1 视图渲染完成后处理 结束共耗时:"+(System.currentTimeMillis()-l));
}
}
2,使用配置类注册拦截器;
@Configuration
public class InterceptorConf implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
Interceptor1 interceptor1 = new Interceptor1();
registry.addInterceptor(interceptor1)
//设置拦截的路径(所有)
.addPathPatterns("
@Configuration
public class InterceptorConf implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
Interceptor1 interceptor1 = new Interceptor1();
registry.addInterceptor(interceptor1)
//设置拦截的路径(所有)
.addPathPatterns("
Interceptor2 interceptor2 = new Interceptor2();
registry.addInterceptor(interceptor2)
//设置拦截的路径(所有)
.addPathPatterns("
Interceptor3 interceptor3 = new Interceptor3();
registry.addInterceptor(interceptor3)
//设置拦截的路径(所有)
.addPathPatterns("
@Pointcut("execution(public * com.codeLead.aopDemo.controller.ByeController.*(..))")
public void point1(){};
// @Pointcut()
public void point2(){};
@Before("point1()")
public void before(JoinPoint joinPoint){
log.info("--这里是前置增强为方法"+joinPoint.getSignature().getName()+"--进行增强!");
}
@After("point1()")
public void after(JoinPoint joinPoint){
log.info("--这里是后置增强为方法"+joinPoint.getSignature().getName()+"--进行增强!");
}
@Around("point1()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("--这里是环绕增强,方法执行前--");
Object proceed = proceedingJoinPoint.proceed();
log.info("--这里是环绕增强,方法执行后--");
return proceed;
}
}
拓展问题:
2022-09-02 23:56:43.912 INFO 11404 --- [nio-8088-exec-2] c.c.a.listener.MyServletRequestListener : --Request 监听器被调用-- 2022-09-02 23:56:43.913 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter3 : ------进入过滤器3------ 2022-09-02 23:56:43.913 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter1 : ------进入过滤器1------ 2022-09-02 23:56:43.913 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter2 : ------进入过滤器2------ 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 开始-- 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 结束共耗时:0 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 开始-- 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 结束共耗时:0 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 开始-- 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 结束共耗时:0 2022-09-02 23:56:43.914 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.aop.TestAspect1 : --这里是环绕增强,方法执行前-- 执行bye方法! 2022-09-02 23:58:17.704 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.aop.TestAspect1 : --这里是环绕增强,方法执行后-- 2022-09-02 23:58:17.706 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 开始-- 2022-09-02 23:58:17.706 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 结束共耗时:0 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 开始-- 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 结束共耗时:0 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 开始-- 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 结束共耗时:0 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 开始-- 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 结束共耗时:0 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 开始-- 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 结束共耗时:0 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 开始-- 2022-09-02 23:58:17.707 INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 结束共耗时:0 2022-09-02 23:58:17.708 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter2 : ------离开过滤器2------共耗时:93795 2022-09-02 23:58:17.708 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter1 : ------离开过滤器1------共耗时:93795 2022-09-02 23:58:17.708 INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter3 : ------离开过滤器3------共耗时:93795 2022-09-02 23:58:17.708 INFO 11404 --- [nio-8088-exec-2] c.c.a.listener.MyServletRequestListener : xx Request 监听器被销毁xx