首页 > 其他分享 >【Spring Security OAuth2】- 【使用Spring MVC开发RESTful API】 使用切片拦截rest服务

【Spring Security OAuth2】- 【使用Spring MVC开发RESTful API】 使用切片拦截rest服务

时间:2024-10-09 08:53:23浏览次数:10  
标签:OAuth2 Instant Spring System API println 源码 public out

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

使用切片拦截rest服务

本节内容

  • 过滤器(Filter)
  • 拦截器(interceptor)
  • 切片(Aspect)

假设一个需求:打印出所有请求的耗时时间

Filter

  • 实现一个javax.servlet.Filter
  • @Component 让这个实现类被spring容器接管

就可以让过滤器生效了

    package com.example.demo.web.filter;
    
    import org.springframework.stereotype.Component;
    
    import javax.servlet.*;
    import java.io.IOException;
    import java.time.Duration;
    import java.time.Instant;
    
    /**
     * ${desc}
     * @author zhuqiang
     * @version 1.0.1 2023/8/2 14:42
     * @date 2023/8/2 14:42
     * @since 1.0
     */
    @Component  // 生效需要让spring容器接管
    public class TimeFilter implements Filter {
        // 初始化
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("TimeFilter init");
        }
    
        // 执行
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            Instant start = Instant.now();
            chain.doFilter(request, response);
            System.out.println("耗时:" + Duration.between(start, Instant.now()).toMillis());
        }
    
        // 销毁
        @Override
        public void destroy() {
            System.out.println("TimeFilter destroy");
        }
    }

编码注册过滤器

传统的过滤器可以使用 web.xml 等方式注册,spring boot 里面可以通过配置类添加

这种方式可以把一些第三方的过滤器添加进来

    package com.example.demo.web.config;
    
    import com.example.demo.web.filter.TimeFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.servlet.Filter;
    
    @Configuration  // 这里的注解别用错了
    public class WebConfig {
        @Bean
        public FilterRegistrationBean timeFilter() {
            FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
            registrationBean.setFilter(new TimeFilter());
            // 可以自定义拦截路径
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    }

过滤器有一些限制,比如获取不到具体是哪一个方法处理的;

过滤器是j2ee的规范,在拦截器之前,还没有进入我们的具体控制器方法的时候被调用

拦截器(interceptor)

  • 实现HandlerInterceptor拦截器
  • 添加到spring kvc中

实现拦截器

    @Configuration
    public class TimeInterceptor implements HandlerInterceptor {
        // 进入方法前
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            request.setAttribute("startTime", Instant.now());
            HandlerMethod method = (HandlerMethod) handler;
            System.out.println("preHandle " + method.getBean().getClass().getName());
            System.out.println("preHandle " + method.getMethodParameters());
            System.out.println("preHandle");
            return true;
        }
    
        // 进入方法后
        // 如果方法异常,则不会进入该节点
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            Instant startTime = (Instant) request.getAttribute("startTime");
            System.out.println("postHandle 耗时" + Duration.between(startTime, Instant.now()).toMillis());
        }
    
        // 请求后:无论如何都会走该节点
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
            System.out.println("afterCompletion");
            // 注意这里的异常,如果异常被全局异常处理器ControllerExceptionHandler消费掉了的话,这里的异常信息的null
            System.out.println("afterCompletion ex" + ex);
        }
    }

添加到spring mvc中: 这个不同于过滤器的添加逻辑,需要手动进行配置

    @Configuration
    // org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter 5.0+已过时
    // 使用了jdk8 的接口默认方法
    public class WebConfig implements WebMvcConfigurer {
        @Autowired
        private TimeInterceptor timeInterceptor;
    
        @Bean
        public FilterRegistrationBean timeFilter() {
            FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
            registrationBean.setFilter(new TimeFilter());
            // 可以自定义拦截路径
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 可以添加多个不同的拦截器
            registry.addInterceptor(timeInterceptor);
        }
    }

切片(Aspect)

提供了更为强大的拦截功能,不只是能拦截mvc的handler;还能拦截符合截点的所有方法或则类

  • 切入点(注解)

    • 在哪些方法上起作用
    • 在什么时候起作用
  • 增强(方法)

    • 起作用时执行的业务逻辑

Aspect 注解属于aop包
`compile(“org.springframework.boot:spring-boot-starter-aop”)

官网能查看表切片怎么使用 和表达式是什么意思
Redirecting...

    @Component
    @Aspect
    public class TimeAspect {
        // 环绕通知 还有其他类型的注解
        // 这里的表达式在官网可以学习怎么使用
        // https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop
        @Around("execution(* com.example.demo.web.controller.UserController.*(..))")
        public Object doAccessCheck(ProceedingJoinPoint point) throws Throwable {
            Instant start = Instant.now();
            Object proceed = point.proceed();  // 类似于调用过滤器链一样
            // 这里对于异常来说和之前的都类似,异常的话下面不会继续走了
            System.out.println("耗时:" + Duration.between(start, Instant.now()).toMillis());
            Object[] args = point.getArgs();
            for (Object arg : args) {
                System.out.println(arg);
            }
            return proceed;
        }
    }

总结

  • 过滤器(Filter)

    • 能拿到最原始的http请求响应对象
    • 拿不到路径具体对于的handler
  • 拦截器(interceptor)

    • 能拿到handler
    • spring家族成员
  • 切片(Aspect)

    • 拿不到http请求响应对象
    • 可以拦截的更多:比如拦截mybatis生成的dao接口方法执行

处理顺序大概是下面这样;controllerAdvice是全局异常处理器

标签:OAuth2,Instant,Spring,System,API,println,源码,public,out
From: https://blog.csdn.net/smart_an/article/details/142773600

相关文章

  • 【含文档+源码】基于SpringBoot的健身工作室管理系统的设计与实现
    项目背景与意义随着健身行业的快速发展,越来越多的消费者开始注重健康和身材管理,这使得健身房成为了一个蓬勃发展的行业。然而,随着客户数量的不断增加,如何有效管理客户信息,提供个性化服务,以及提升客户满意度,成为了健身房面临的重要挑战。传统的客户信息管理方式往往依赖于纸质......
  • springboot-网站开发-linux服务器部署jar格式图片存档路径问题
    springboot-网站开发-linux服务器部署jar格式图片存档路径问题!近期在部署自己的网站源码,使用的是jar格式的编码格式。发布到远程服务器后,发现客户捐款的证书图片存在异常。经过排查代码,找到了原因。下面分享给大家。1:首先,在linux服务器内部,存档图片,文件等资源的时候,本地java......
  • springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件
    springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件!这种错误的情况,发生,一般都是因为,我们自己的html模板文件,存档位置并不是在默认的templates下面。而是我们自己新建的一个子目录里面。然后,我们在java代码里面,控制器方法体内,return,返回模板的时候,我们多写了一个......
  • Google:敏感信息访问权限和 API 政策更新
    目录公布时间公布内容内容有关GooglePlay照片和视频权限政策的详细信息截止时间相关问题公布时间公布日期:2023-10-25公布内容内容为向用户提供更注重隐私保护的体验,我们将推出“照片和视频访问权限”政策,以减少获准针对照片/视频请求广泛权限(READ_......
  • 基于数据可视化+Java+SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现
    文章目录前言系统演示录像论文参考代码运行展示图技术框架SpringBoot技术介绍系统测试系统测试的目的系统功能测试推荐选题:代码参考实现案例找我做程序,有什么保障?联系我们前言......
  • springboot+vue基于工作流的会议和督办管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在当今快节奏的商业环境中,高效会议与事务督办成为企业日常运营不可或缺的一部分。然而,传统会议管理方式往往存在流程繁琐、效率低下、资源分配不均等问题,影响了企业的决策速度和执行力。随着信息技术的飞速发展,工作流技术在各类管理系......
  • springboot+vue基于的个人健康管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在信息化高速发展的时代,个人健康管理已成为现代社会关注的焦点。随着人们生活水平的提高和健康意识的增强,越来越多的人开始重视个人健康状况的监测与管理。然而,传统的健康管理方式存在诸多不便,如信息记录不完整、健康数据分散、健康咨......
  • springboot+vue基于SpringBoot的个人健康管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,人们对个人健康管理的重视程度日益提升。在信息化时代背景下,利用互联网技术实现个人健康信息的有效管理与跟踪已成为一种趋势。传统的健康管理方式大多依赖于纸质记录或零散的电子文档,难以形成系统化的健康档案......
  • springboot+vue基于大数据的疫情追踪系统的设计和实现【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着全球信息化技术的飞速发展,大数据已成为推动社会进步和产业升级的重要力量。近年来,全球范围内频繁爆发的疫情事件,对公共卫生体系构成了严峻挑战。传统的疫情追踪方式存在信息滞后、数据孤岛等问题,难以有效应对疫情的快速传播。因此......
  • API 学习路线图
    无论您是初学者还是经验丰富的开发人员,都希望了解API,这份全面的API学习路线图将指导您了解需要掌握的关键概念和技术:1.API简介  API定义:API是一组用于构建软件应用程序的协议、例程和工具。它指定了软件组件应如何交互。  API类型:   公共API:开放供外部开......