我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JAVA开发(AOP之ProceedingJoinPoint)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JAVA开发(AOP之ProceedingJoinPoint)

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JAVA开发(AOP之ProceedingJoinPoint)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring开发核心之AOP的实现与切入点持久化

面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和“对象”来实现,所以,面向对象编程其实就是对“类”和“对象”的使用,面向切面编程,简单的说,就是动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
2022-11-13

Java Spring之XML的AOP怎么配置

本篇内容主要讲解“Java Spring之XML的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之XML的AOP怎么配置”吧!1 环境搭建示例:在学习 spr
2023-07-05

Java中Spring框架之AOP如何配置

这篇文章主要介绍了Java中Spring框架之AOP如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  什么是AOP  AOP(Aspect Oriented Prog
2023-06-02

Android开发方式之Java+html+javascript混合开发

android开发,除了使用原生态的开发方式之外,还可以使用java+html+javascript混合开发的方式来开发,这样可以节省大量的开发时间,同时还可以使不同设备的用户获得相同的用户体验。好了,废话不多说,先来看看今天要做什么。
2022-06-06

Java前端开发之HttpServletRequest的使用

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大
2023-01-05

Java开发之代码规范详解

Java开发中所要遵守的编码规范大体上有如下7点。命名规范、注释规范、缩进排版规范、文件名规范、声明规范、语句规范以及编程规范。【推荐学习:java视频教程】1.命名规范(1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9)和下划线“_”。(
Java开发之代码规范详解
2021-07-11

SpringBoot开发怎么使用AOP记录日志

这篇文章主要讲解了“SpringBoot开发怎么使用AOP记录日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot开发怎么使用AOP记录日志”吧!为什么要用AOP?答案是解
2023-06-25

Java Spring之基于注解的AOP怎么配置

本篇内容主要讲解“Java Spring之基于注解的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之基于注解的AOP怎么配置”吧!1 环境搭建1.1 第一步:
2023-07-05

Java开发之HashMap的使用和遍历

Java开发之HashMap的使用和遍历1:使用HashMap的一个简单例子package com.pb.collection; import java.util.HashMap; import java.util.Iterator; i
2023-05-31

java JSP开发之Spring中Bean的使用

java JSP开发之Spring中Bean的使用在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后bean就可以被使用了,一旦该bean不再使用,Java就自动进行垃圾回收。然而,在Spri
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录