栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

过滤器、拦截器、监听器、AOP 学习笔记

Java 更新时间:发布时间: 百科书网 趣学号

学习参考博客:
彻底搞懂过滤器、拦截器、监听器、AOP,看这一篇就足够了
基础知识还是不够扎实,参考大佬博客学习了一波。以下为学习笔记

过滤器

是sevlet 中的一种常用技术,本质上就是一个 实现了 Filter接口的 Java类。

使用步骤(springboot 环境下):
1,实现 Filter接口(javax.servlet 包下)并重写其 3个方法;

  • init() 过滤器初始化。在项目启动时加载调用;
  • doFilter() 进入过滤器时的具体操作;
  • destory() 过滤器销毁,在容器销毁(项目停止)时加载调用;

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,设置多个过滤器的过滤顺序?
默认是按照过滤器的类名字母先后顺序,或是数字大小依次调用的。

  • web.xml 配置,谁在上面谁先执行;
  • 编写config 配置文件去加载 过滤器。重上往下顺序执行;(需要把过滤器上的@WebFilter 注解去掉了)
    例子:TestFilter3 > TestFilter1 > TestFilter2;
@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;
    }
}

拓展问题:

  • 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
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1075639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号