返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA开发(AOP之ProceedingJoinPoint)
  • 570
分享到

JAVA开发(AOP之ProceedingJoinPoint)

java微服务Poweredby金山文档 2023-09-20 10:09:35 570人浏览 薄情痞子
摘要

我们在开发过程中经常使用到自定义注解来实现在一些类或者方法执行过程中切面,统一实现某些业务操作。例如自定义注解 import java.lang.annotation.Documented;import java.lang.annotat

我们在开发过程中经常使用到自定义注解来实现在一些类或者方法执行过程中切面,统一实现某些业务操作。例如自定义注解

import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.util.Map;@Documented@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface CtgEncrypt {        Class paramType() default Map.class;        String securityType() default "AES";        String reType() default "";}

注解一般开门见山,说我要干一个什么事情。使用@interface来修饰。例如上面这个注解就是用来对方法上的参数进行加密的。

@Target({ElementType.METHOD,ElementType.TYPE})

这个代码作用的METHOD(方法)上

@Retention(RetentionPolicy.RUNTIME)

这个代码代码运行时执行操作。

自定义的注解需要实现它功能才能用,不是注解了注解本身就有这个功能,没那么强大。

第二步实现注解功能。

import java.util.Arrays;import java.util.List;import java.util.Map;import javax.servlet.Http.httpservletRequest;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import org.springframework.util.AntPathMatcher;import com.alibaba.fastJSON.jsONObject;import cn.ctg.common.response.ResponseCode;import cn.ctg.common.response.ResponseData;import cn.ctg.common.util.UserTokenUtils;import cn.ctg.common.util.XssUtils;import cn.hutool.json.JSONUtil;@Aspect@Componentpublic class SecurityAspect {    @Value("${keys.aeskey:-1}")    private String AES_KEY;    @Value("${keys.Jwtkey:-1}")    private String JWT_KEY;    @Value("${xss.url:-1}")    private String xxsUrl;    private AntPathMatcher antPathMatcher = new AntPathMatcher();        @Pointcut("@annotation(cn.ctg.common.util.security.CtgDecrypt) || @annotation(cn.ctg.common.util.security.CtgEncrypt)")    public void pointCut(){ }        @Around("execution(* cn.ctg.*.controller.*.*(..))")    public Object doAroundhtml(ProceedingJoinPoint joinPoint) throws Throwable {        Object[] args = joinPoint.getArgs();        HttpServletRequest httpServletRequest = UserTokenUtils.getHttpServletRequest();        String requestURI = httpServletRequest.getRequestURI();        String[] split = xxsUrl.split("\\|");        if(split==null){            return joinPoint.proceed(args);        }        if(pathMatcher(Arrays.asList(split),requestURI)) {            for (int i = 0; i < args.length; i++) {                Object arg = args[i];                Map map = JSONUtil.parseObj(JSONObject.toJSONString(arg));                for (Map.Entry entry : map.entrySet()) {                    if (XssUtils.isStripXSS(entry.getValue().toString())) {                        ResponseData responseData = ResponseData.error(ResponseCode.XSS_CODE_ERROR);                        return responseData;                    }                }            }        }        return joinPoint.proceed(args);    }        @Around("pointCut()")    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {        //执行方法,获取返回值        Object result = joinPoint.proceed();        String data = JSONUtil.toJsonStr(((ResponseData) result).getData());        if(data.equals("{}")){            data = String.valueOf(((ResponseData) result).getData());        }                ((ResponseData) result).setEncrypt(true);        return result;    }    // 白名单查询    private boolean pathMatcher(List urlList, String requestUri) {        for (String url : urlList) {            if (antPathMatcher.match(url, requestUri)) {                return true;            }        }        return false;    }}  

代码中的这一句 @Pointcut("@annotation(cn.ctg.common.util.security.CtgDecrypt) || @annotation(cn.ctg.common.util.security.CtgEncrypt)")

就是用来实现CtgEncrypt这个注解的

再使用@Around("pointCut()")进行方法环绕。实现注解的动作。

        @Around("pointCut()")    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {        //执行方法,获取返回值        Object result = joinPoint.proceed();        String data = JSONUtil.toJsonStr(((ResponseData) result).getData());        if(data.equals("{}")){            data = String.valueOf(((ResponseData) result).getData());        }                ((ResponseData) result).setEncrypt(true);        return result;    }

这是我们看到一个重要类型ProceedingJoinPoint。执行当前切点的意思

这里就通过源码看看ProceedingJoinPoint能做什么东西。

package org.aspectj.lang;import org.aspectj.runtime.internal.AroundClosure;public interface ProceedingJoinPoint extends JoinPoint {        void set$AroundClosure(AroundClosure arc);         default void stack$AroundClosure(AroundClosure arc) {         throw new UnsupportedOperationException();     }        public Object proceed() throws Throwable;        public Object proceed(Object[] args) throws Throwable;}

从源码上继承了JoinPoint

public Object proceed() throws Throwable;

Proceed with the next advice or target method invocation

继续执行下一个通知或目标方法调用

获取当前正在执行的对象(如果不可用则为空——例如静态上下文)

Object getThis();

获取目标对象(如果没有,则为空)

Object getTarget();

获取这个连接点上的参数

Object[] getArgs();

获取连接点上的签名。

Signature getSignature();

来源地址:https://blog.csdn.net/dongjing991/article/details/128654007

--结束END--

本文标题: JAVA开发(AOP之ProceedingJoinPoint)

本文链接: https://lsjlt.com/news/412319.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JAVA开发(AOP之ProceedingJoinPoint)
    我们在开发过程中经常使用到自定义注解来实现在一些类或者方法执行过程中切面,统一实现某些业务操作。例如自定义注解 import java.lang.annotation.Documented;import java.lang.annotat...
    99+
    2023-09-20
    java 微服务 Powered by 金山文档
  • SpringBoot开发教程之AOP日志处理
    目录日志处理:需求分析实现过程:实验效果:参考文献:总结日志处理: 需求分析 日志处理需要记录的是: 请求的URL 访问者IP 调用的方法 传入...
    99+
    2024-04-02
  • java开发AOP面向切面编程入门
    目录引言不好的解决方案面向过程的解决方案使用继承解决方案使用聚合的解决方案面向切面的编程基本概念基于Spring面向切面程序实现小结引言 在实际应用场景中,我们封装一个学生的类,这个...
    99+
    2024-04-02
  • Java Spring AOP之PointCut案例详解
    目录一、PointCut接口二、ClassFilter接口三、MethodMatcher接口总结一、PointCut接口 package org.springframewor...
    99+
    2024-04-02
  • SpringBoot开发技巧之使用AOP记录日志示例解析
    目录为什么要用AOP?常用的工作场景必须知道的概念AOP 的相关术语Spring 中使用注解创建切面实战应用-利用AOP记录日志定义日志信息封装统一日志处理切面为什么要用AOP? 答...
    99+
    2024-04-02
  • Spring开发核心之AOP的实现与切入点持久化
    目录前言一、AOP的简单实现二、Spring的切入点三、Aspect对AOP的支持四、Spring持久化事务应用的管理应用JdbcTemplate操作数据库与Hibernate整合前...
    99+
    2022-11-13
    Spring AOP切面编程 Spring 切入点 Spring 持久化
  • Java Spring之XML的AOP怎么配置
    本篇内容主要讲解“Java Spring之XML的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之XML的AOP怎么配置”吧!1 环境搭建示例:在学习 spr...
    99+
    2023-07-05
  • Java中Spring框架之AOP如何配置
    这篇文章主要介绍了Java中Spring框架之AOP如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  什么是AOP  AOP(Aspect Oriented Prog...
    99+
    2023-06-02
  • Android开发方式之Java+html+javascript混合开发
    android开发,除了使用原生态的开发方式之外,还可以使用java+html+javascript混合开发的方式来开发,这样可以节省大量的开发时间,同时还可以使不同设备的用户...
    99+
    2022-06-06
    HTML JAVA android开发 JavaScript Android
  • Java开发之代码规范详解
    Java开发中所要遵守的编码规范大体上有如下7点。命名规范、注释规范、缩进排版规范、文件名规范、声明规范、语句规范以及编程规范。【推荐学习:java视频教程】1.命名规范(1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9...
    99+
    2021-07-11
    java入门 Java 代码规范
  • Java前端开发之HttpServletRequest的使用
    目录接口详解搭设基本测试环境取回 keys取回 values请求域与应用域应用域对象请求域对象跳转与转发转发一次请求转发要求转发区别request 常见方法设置字符集几种常见属性获取...
    99+
    2023-01-05
    Java HttpServletRequest用法 Java HttpServletRequest的使用
  • Java微服务开发之Swagger详解
    目录一、Swagger的作用和概念1、Swagger 的优势2、SwaggerUI 特点2、SpringBoot集成Swagger3、配置Swagger4、实体配置5、其他皮肤一、S...
    99+
    2024-04-02
  • Spring基于AspectJ的AOP开发案例解析
    目录AspectJ简介注解开发环境准备不同的通知类型最通知中通过value属性定义切点入门案列@Before前置通知@AfterReturning后置通知@Around环绕通知@Af...
    99+
    2024-04-02
  • SpringBoot开发怎么使用AOP记录日志
    这篇文章主要讲解了“SpringBoot开发怎么使用AOP记录日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot开发怎么使用AOP记录日志”吧!为什么要用AOP?答案是解...
    99+
    2023-06-25
  • Java Spring之基于注解的AOP怎么配置
    本篇内容主要讲解“Java Spring之基于注解的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之基于注解的AOP怎么配置”吧!1 环境搭建1.1 第一步:...
    99+
    2023-07-05
  • Java之Spring注解开发案例详解
    在Spring4之后,要使用注解开发,必须要保证aop的包导入了 使用注解需要导入context约束,增加注解的支持! <?xml ver...
    99+
    2024-04-02
  • Java Maven高级之插件开发详解
    目录前言创建自定义插件总结前言 终于来到了Maven的插件开发,其实Maven的插件并没有想象的那么难,刚开始讲Maven基础的时候就演示了一下JDK是如何打包的,Maven打包只是...
    99+
    2024-04-02
  • Java开发之ssm三大框架整合
    目录1.springmvc2.spring-dao.xml与mybatis-config.xml3.spring-service.xml4.引用1.springmvc 和只有spri...
    99+
    2024-04-02
  • Java开发之HashMap的使用和遍历
    Java开发之HashMap的使用和遍历使用HashMap的一个简单例子package com.pb.collection; import java.util.HashMap; import java.util.Iterator; imp...
    99+
    2023-05-31
    java hashmap ava
  • java JSP开发之Spring中Bean的使用
    java JSP开发之Spring中Bean的使用在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后bean就可以被使用了,一旦该bean不再使用,Java就自动进行垃圾回收。然而,在Spri...
    99+
    2023-05-31
    spring bean bea
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作