学习参考博客:
彻底搞懂过滤器、拦截器、监听器、AOP,看这一篇就足够了
基础知识还是不够扎实,参考大佬博客学习了一波。以下为学习笔记
过滤器
是sevlet 中的一种常用技术,本质上就是一个 实现了 Filter接口的 Java类。
使用步骤(springboot 环境下):
1,实现 Filter接口(javax.servlet 包下)并重写其 3个方法;
- init() 过滤器初始化。在项目启动时加载调用;
- doFilter() 进入过滤器时的具体操作;
- destory() 过滤器销毁,在容器销毁(项目停止)时加载调用;
2,设置过滤器名称、及需要过滤的资源路径;
例:设置一个叫 testFilterName的过滤器,过滤拦截系统内所有资源路径;
@WebFilter(filterName = “testFilterName”, urlPatterns = “/*”)
3,需要将过滤器注入到容器内;(两种方式不可同时使用)
- 可以在过滤器类上直接加 @Component 注解;
- 也可以在启动类上加 @ServletComponentScan 注解;
代码实例
@Log4j2
@WebFilter(filterName = "testFilter1", urlPatterns = "/aop/hello/*")
public class TestFilter1 implements Filter {
/**
* 初始化过滤器1
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("初始化过滤器1");
}
/**
* 进入过滤器1
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@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);
}
/**
* 销毁过滤器1
*/
@Override
public void destroy() {
log.info("xxxxxx销毁过滤器1xxxxxx");
}
/**
* 异常 返回数据
*
* @param response
* @param data
*/
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,设置多个过滤器的过滤顺序?
默认是按照过滤器的类名字母先后顺序,或是数字大小依次调用的。
- web.xml 配置,谁在上面谁先执行;
- 编写config 配置文件去加载 过滤器。重上往下顺序执行;(需要把过滤器上的@WebFilter 注解去掉了)
例子:TestFilter3 > TestFilter1 > TestFilter2;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean pathFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter3());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
@Bean
public FilterRegistrationBean jwtFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter1());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
@Bean
public FilterRegistrationBean decodeFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter2());
registrationBean.addInitParameter("", "");
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
2,多个过滤器的执行链路?
先进入的过滤器最后结束;
2022-08-31 22:26:10.044 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter3 : ------进入过滤器3---
2022-08-31 22:26:10.045 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter1 : ------进入过滤器1---
2022-08-31 22:26:10.045 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter2 : ------进入过滤器2---
调用执行了sayhello接口!
2022-08-31 22:26:10.090 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter2 : --离开过滤器2--共耗时:45
2022-08-31 22:26:10.091 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter1 : --离开过滤器1--共耗时:46
2022-08-31 22:26:10.091 INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter3 : --离开过滤器3--共耗时:47
拦截器
是spring里的一种技术,功能与拦截器类似,但是标准和实现不同。
使用场景:
- 登录认证:使用拦截器验证用户登录状态,如果没有登录或是登录失败,给用户进行返回提示;
- 记录系统日志:记录用户的操作情况,请求IP,方法执行时间等,对系统运行情况进行监控;
实现步骤:
1,需要实现 HandlerInterceptor 接口,及重写其内部3个方法;
- preHandle() : 在 controller 处理请求之前被调用,
- postHandle():在 controller 处理请求完成后、生成视图前被调用;
- afterCompletion():在DispatcherServlet 完全处理请求后被调用,通常用于记录消耗时间,也可以对一些资源进行处理;
/**
* 拦截器1
*/
@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) {
/**
* 配置拦截器1
*/
Interceptor1 interceptor1 = new Interceptor1();
registry.addInterceptor(interceptor1)
//设置拦截的路径(所有)
.addPathPatterns("/**")
//设置放行的路径
.excludePathPatterns("/aop/hello/**");
}
}
拓展问题:
- 配置多个拦截器、设置多个拦截器的执行顺序
配置类中添加多个拦截器
/**
* 拦截器配置类
*/
@Configuration
public class InterceptorConf implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 配置拦截器1
*/
Interceptor1 interceptor1 = new Interceptor1();
registry.addInterceptor(interceptor1)
//设置拦截的路径(所有)
.addPathPatterns("/**")
//设置放行的路径
.excludePathPatterns("/aop/hello/**")
//设置多个拦截器的执行顺序(序号越小越先执行)
.order(1);
/**
* 配置拦截器2
*/
Interceptor2 interceptor2 = new Interceptor2();
registry.addInterceptor(interceptor2)
//设置拦截的路径(所有)
.addPathPatterns("/**")
//设置放行的路径
.excludePathPatterns("/aop/hello/**")
//设置多个拦截器的执行顺序(序号越小越先执行)
.order(0);
/**
* 配置拦截器3
*/
Interceptor3 interceptor3 = new Interceptor3();
registry.addInterceptor(interceptor3)
//设置拦截的路径(所有)
.addPathPatterns("/**")
//设置放行的路径
.excludePathPatterns("/aop/hello/**")
//设置多个拦截器的执行顺序(序号越小越先执行)
.order(2);
}
}
- 拦截器的执行链路(拦截器与过滤器在一起的执行链路)
进入过滤器 -> 进入请求执行前处理 -> 进入请求完成后处理 -> 进入视图渲染完成后处理 ->离开过滤器
2022-09-01 21:36:23.460 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3 : ------进入过滤器3------
2022-09-01 21:36:23.460 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1 : ------进入过滤器1------
2022-09-01 21:36:23.460 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2 : ------进入过滤器2------
2022-09-01 21:36:23.469 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 开始--
2022-09-01 21:36:23.469 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 结束共耗时:0
2022-09-01 21:36:23.469 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 开始--
2022-09-01 21:36:23.470 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 结束共耗时:1
2022-09-01 21:36:23.470 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 开始--
2022-09-01 21:36:23.470 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 结束共耗时:0
执行bye方法!
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 开始--
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 开始--
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 开始--
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 开始--
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 开始--
2022-09-01 21:36:35.667 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.668 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 开始--
2022-09-01 21:36:35.668 INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.669 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2 : ------离开过滤器2------共耗时:12209
2022-09-01 21:36:35.669 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1 : ------离开过滤器1------共耗时:12209
2022-09-01 21:36:35.669 INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3 : ------离开过滤器3------共耗时:12209
监听器
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。
使用场景:
可以通过 HttpSessionListener来统计当前在线人数、ip等信息;
监听器种类(部分):
- ServletRequestListener
对Request 对象进行监听;(所有接口请求都会进入)
@Component
@Log4j2
public class MyServletRequestListener implements ServletRequestListener {
//请求结束时调用
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.info("xx Request 监听器被销毁xx");
}
//请求开始时被调用
@Override
public void requestInitialized(ServletRequestEvent sre) {
log.info("--Request 监听器被调用--");
}
}
- HttpSessionListener
对 HttpSession 生命周期进行监听;(如果在请求的方法中 获取或者使用了session对象,那么则会进入!)
ps:在业务代码中 获得 session 对象的方式;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
@Log4j2
@Component
public class MyHttpSessionListener implements HttpSessionListener {
public static AtomicInteger userCount = new AtomicInteger(0);
//会话产生时调用
@Override
public void sessionCreated(HttpSessionEvent se) {
int andIncrement = userCount.getAndIncrement();
int i = userCount.get();
se.getSession().getServletContext().setAttribute("sessionCount", i);
int i1 = userCount.get();
log.info("【在线人数】人数增加为:{}",i1);
//此处可以在ServletContext域对象中为访问量计数,然后传入过滤器的销毁方法
//在销毁方法中调用数据库入库,因为过滤器生命周期与容器一致
}
//会话关闭时调用
@Override
public synchronized void sessionDestroyed(HttpSessionEvent se) {
userCount.getAndDecrement();
se.getSession().getServletContext().setAttribute("sessionCount", userCount.get());
log.info("【在线人数】人数减少为:{}",userCount.get());
}
}
- ServletContextListener
对 ServletContext 生命周期进行监听;(在项目启动或是关闭时会进入对应方法)
@Component
@Log4j2
public class MyServletContextListener implements ServletContextListener {
//项目启动时调用
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("-- Servlet 上下文监听器被调用初始化 --");
}
//项目关闭时调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("xxServlet 上下文监听器被调用销毁xx");
}
}
拓展问题:
- 监听器的执行链路(拦截器、过滤器、监听器在一起的执行链路)
监听器被调用 -> 过滤器 -> 拦截器 -> 监听器被销毁
2022-09-02 00:05:39.468 INFO 18060 --- [nio-8088-exec-1] c.c.a.listener.MyServletRequestListener : --Request 监听器被调用--
2022-09-02 00:05:39.474 INFO 18060 --- [nio-8088-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-09-02 00:05:39.474 INFO 18060 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2022-09-02 00:05:39.475 INFO 18060 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2022-09-02 00:05:39.480 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3 : ------进入过滤器3------
2022-09-02 00:05:39.481 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1 : ------进入过滤器1------
2022-09-02 00:05:39.481 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2 : ------进入过滤器2------
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 开始--
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求执行前处理 结束共耗时:0
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 开始--
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求执行前处理 结束共耗时:0
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 开始--
2022-09-02 00:05:39.491 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求执行前处理 结束共耗时:0
执行bye方法!
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 请求完成后处理 结束共耗时:1
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 请求完成后处理 结束共耗时:0
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 请求完成后处理 结束共耗时:0
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3 : --拦截器3 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1 : --拦截器1 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516 INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2 : --拦截器2 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.517 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2 : ------离开过滤器2------共耗时:36
2022-09-02 00:05:39.518 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1 : ------离开过滤器1------共耗时:37
2022-09-02 00:05:39.518 INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3 : ------离开过滤器3------共耗时:38
2022-09-02 00:05:39.518 INFO 18060 --- [nio-8088-exec-1] c.c.a.listener.MyServletRequestListener : xx Request 监听器被销毁xx
AOP
AOP 称为面向切面编程,在程序开发中主要用来解决一些系统层面上的公共部分的问题,在不改变原有的逻辑的基础上,增加一些额外的功能,比如日志,事务,权限等等;
相关概念:
切面:即定义的切面类,类里面可以定义切点,和通知,使用 @Aspect 注解表名当前类是一个切面类;
切点:定义一个方法(一般为空方法),使用 @Pointcut 注解表示当前方法是一个切点。需要在注解的execution 内使用表达式注明要切入的指定路径、方法;
增强(通知):定义一个方法,使用需要的增强方式注解,有前置增强、后置增强、环绕增强等,即切入到某个切点(方法)后需要做的事情;
- @Before 前置增强: 在目标方法被调用之前做增强处理,
- @After 后置增强: 在目标方法调用之后的增强处理;
- @Around 环绕增强: 可以在目标方法调用前后分别做处理
@Aspect
@Component
@Log4j2
public class TestAspect1 {
/**
* 要验证的:
* 1,验证拦截所有方法;
* 2,分别验证 2个增强的参数 JoinPoint ProceedingJoinPoint
* 3,验证拦截指定的方法;
* 4,验证拦截 包含指定参数的方法
* ..
*
*/
/**
* 表达式含义:
* 第一个* 的位置,代表返回值类型,中间是空格连接; * 表示所有返回值类型
* 第二个* 的位置,代表包路径,中间是 .连接; * 表示所有路径
* 第三个* 的位置,代表方法名 ;* 表示所有方法
* 括号内代表的是参数(..); (..)表示任何参数
*
* 切入所有返回值类型、所有路径下的、不限制参数的所有方法;
*/
@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;
}
}
拓展问题:
- AOP的执行链路(AOP,拦截器、过滤器、监听器在一起的执行链路)
依次执行 监听器 -> 过滤器 ->拦截器 ->AOP
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
9133

被折叠的 条评论
为什么被折叠?



