【开端】JAVA中的切面使用

news2024/11/14 17:04:36

一、绪论

    在不使用过滤器和 拦截器的前提下,如果统一对JAVA的 方法进行 管理。比如对一类方法或者类进行日志监控,前后逻辑处理。这时就可以使用到切面。它的本质还是一个拦截器。只是通过注解的方式来标识所切的方法。

二、JAVA中切面的使用实例

@Aspect
@Component
public 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.xxx.common.util.security.CtgDecrypt) || @annotation(cn.xxx.common.util.security.CtgEncrypt)")
    public void pointCut(){ }

    /**
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(* cn.xxx.*.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<String, Object> map = JSONUtil.parseObj(JSONObject.toJSONString(arg));
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    if (XssUtils.isStripXSS(entry.getValue().toString())) {
                        ResponseData<Object> 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<String> urlList, String requestUri) {
        for (String url : urlList) {
            if (antPathMatcher.match(url, requestUri)) {
                return true;
            }
        }
        return false;
    }

}

@Aspect
@Component
public 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.xxx.common.util.security.CtgDecrypt) || @annotation(cn.ctg.common.util.security.CtgEncrypt)")
    public void pointCut(){ }

    /**
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(* cn.xxx.*.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<String, Object> map = JSONUtil.parseObj(JSONObject.toJSONString(arg));
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    if (XssUtils.isStripXSS(entry.getValue().toString())) {
                        ResponseData<Object> 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<String> urlList, String requestUri) {
        for (String url : urlList) {
            if (antPathMatcher.match(url, requestUri)) {
                return true;
            }
        }
        return false;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何看待“低代码”开发平台的兴起

目录 1.概述 1.1.机遇 1.2.挑战 1.3.对开发者工作方式的影响 2.技术概览 2.1.主要特点 2.2.市场现状 2.3.主流低代码平台 2.4.分析 3.效率与质量的权衡 3.1.提高开发效率 3.2.质量与安全隐患 3.3.企业应用开发的利弊分析 4.挑战与机遇 4.1.机遇 4.2.挑战 4.3.…

为什么需要在线实时预览3D模型?如何实现?

在线实时预览3D模型在现代设计、产品开发、市场营销、以及娱乐等领域中变得越来越重要&#xff0c;原因可以归结为以下几个方面&#xff1a; 1、多平台兼容性&#xff1a; 在线实时预览通常不依赖于特定的操作系统或软件平台&#xff0c;只要设备能够访问互联网和浏览器&…

21-原理图的可读性的优化处理

1.自定义原理图尺寸 先将原理图移动到左下角 2.划分模块 3.放置模块字符串

第三期书生大模型实战营——基础岛

1.书生大模型全链路开源体系 【书生浦语大模型全链路开源开放体系】 https://www.bilibili.com/video/BV18142187g5/?share_sourcecopy_web&vd_source711f676eb7f61df7d2ea626f48ae1769 视频里介绍了书生浦语大模型的开源开放体系&#xff0c;包括了其的技术发展、模型架…

ubuntu系统下安装LNMP集成环境的详细步骤(保姆级教程)

php开发中集成环境的安装是必不可少的技能,而LNMP代表的是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。今天就给大家分享下LNMP的安装步骤。 1 Nginx安装 在安装Nginx前先执行下更新命令: sudo apt-get update 接下来开始安装Nginx, 提示:Could not get lock /v…

【mysql 第二篇章】请求到真正执行 SQL 到底是一个怎么样的过程?

从用户调用到SQL执行的流程中间发生了什么事情 1、网络请求使用 线程 来处理&#xff0c;当数据库连接池中监听到有连接请求&#xff0c;这个时候会分配一个线程来处理。 2、SQL接口 负责接收 SQL 语句&#xff0c;当线程监听到有请求和读取数据的之后&#xff0c;将 SQL 语句…

Android Fragment:详解,结合真实开发场景Navigation

目录 1&#xff09;Fragment是什么 2&#xff09;Fragment的应用场景 3&#xff09;为什么使用Fragment? 4&#xff09;Fragment如何使用 5&#xff09;Fragment的生命周期 6&#xff09;Android开发&#xff0c;建议是多个activity&#xff0c;还是activity结合fragment&…

SparkSQL——AnalyzedLogicalPlan生成

Rule和RuleExecutor SparkSQL中对LogicalPlan的解析、优化、还有物理执行计划生成都是分成一个个Rule进行的。 RuleExecutor是一个规则引擎&#xff0c;它收集Rule&#xff0c;并对plan按照rule进行执行。 每一个Rule的实现类都要实现apply方法&#xff0c;具体逻辑都放在这个…

mysql中的时间相关函数

MySQL服务器中有3种时区设置&#xff1a; 系统时区&#xff08;保存在system_time_zone系统变量中&#xff09;服务器时区&#xff08;保存在全局系统变量time_zone中&#xff09;每个客户端连接的时区&#xff08;保存在会话变量time_zone中&#xff09; 其中&#xff0c;客…

极米RS10Plus性价比高吗?7款4-6K价位投影仪测评哪款最好

通常家庭想买个投影仪都会选择4-6K这个价位段的投影仪&#xff0c;3K以下的投影配置太低&#xff0c;6K以上的价格略高&#xff0c;4-6K价位段的中高端投影仪正好满足大部分家庭的使用需求。正好极米投影在8月份上新了一款Plus版本的长焦投影&#xff1a;极米RS10Plus&#xff…

剪切走的照片找回:数据恢复实战指南

一、引言&#xff1a;当珍贵瞬间遭遇剪切失误 在数字化时代&#xff0c;照片不仅是记忆的载体&#xff0c;更是情感与故事的传承。然而&#xff0c;一次不经意的剪切操作失误&#xff0c;却可能让这些珍贵的瞬间面临丢失的风险。面对剪切走的照片&#xff0c;许多用户会感到无…

AI看奥运 | 从巴黎奥运会看人工智能的应用和发展

2024巴黎奥运会火热空前&#xff0c;从开幕式到金牌争夺战&#xff0c;本届奥运会的关注热度持续攀升。与往届不同的是&#xff0c;本届奥运会不仅是首次在体育场馆外举办的户外开幕式的奥运会&#xff0c;同时也是在转播技术上首次广泛应用AI技术的奥运会&#xff0c;包括“时…

C++ 新特性 | C++20 常用新特性介绍

目录 1、模块(Modules) 2、协程(Coroutines) 3、概念(Concepts) 4、范围(Ranges) 5、三向比较符&#xff08;three-way comparison&#xff09; C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https…

哈尔滨等保测评——为工业网络安全保驾护航新航标

哈尔滨&#xff0c;这个以冰雪和美丽闻名世界的城市&#xff0c;现在又树立了一个全新的行业标准&#xff0c;那就是“等保”&#xff0c;正在掀起一场新的安全革命&#xff0c;保卫着这个智能时代&#xff01; ❄️【哈尔滨新视野】❄️ 哈尔滨是一块充满创新活力的土地&…

数据结构之Map和Set(下)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 上一篇文章&#xff0c;我们学习了&#xff1a;二叉搜索树、Map和Set的介绍以及常见方法的基本使用…

充电宝啥牌子质量好性价比高?探寻性价比高充电宝!

这个移动设备无处不在的时代&#xff0c;充电宝已经成为我们生活中不可或缺的配件。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;许多人在选择时往往感到困惑。如何找到一款质量好、性价比高的充电宝&#xff0c;成为了众多消费者关注的焦点。本文将带您…

SpringMVC (发送请求——>参数传递—— >响应数据)

设置请求访问路径 RequestMapper&#xff1a;将请求访问路径和我们业务层的方法联系起来 ResponseBody&#xff1a;将我们业务层方法的返回值转化为json&#xff0c;xml或其他格式的数据返回给页面 两种请求 get请求 post请求 测试案例 RequestMapping("/getNameAndAge&…

Linux逻辑卷管理LVM

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 提示&a…

应急响应:Windows 入侵排查思路.

什么是应急响应. 一个组织为了 应对 各种网络安全意外事件的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 目录&am…

数字货币市场历史数据获取API(含源代码)

加密数字货币市场历史数据获取API&#xff08;含源代码&#xff09; 数字货币市场历史数据获取API&#xff08;含源代码&#xff09;1. Binance API运行结果BTCUSDT.csv 文件截图 2. CoinGecko API3. CryptoCompare API总结 数字货币市场历史数据获取API&#xff08;含源代码&a…