AOP到底是啥

这篇具有很好参考价值的文章主要介绍了AOP到底是啥。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

回忆起来,第一次听到这三字母是博主在上大二的时候,那时候看的一脸懵逼,现在马上研二了才想起来回顾下。

只记得当时面向对象编程还没整明白,这一下子又来个面向切面编程,这直接给整懵了。。。。
AOP到底是啥,java,后端,后端,java,springboot
面向对象相信大家都很了解了,那咱们接下来看看什么是面向切面编程。

面向切面编程到底是啥意思

咱不整哪些官方话术了,整点通俗的。

想象以下这样的一个场景,你接手了一个人员管理系统,这个项目并没有做任何的权限管理,并且大部分功能已经完成,这时候甲方突然来了个新需求,我现在希望你加上对人员管理的权限,即部门经理只能管理其部门的人员,不能管理其他部门的人员。

这时候,你可能想到要不加个安全框架,但很快你就放弃了,因为这种需要给权限的接口实在是太多了,总不能一个个根据用户权限限制管理权限这么去改吧。

这时候aop的作用就出现了
AOP到底是啥,java,后端,后端,java,springboot
那可以怎么做呢?

我们通常会将包含接口的Controller都放在一个package中,这时候我们就在想,我们可不可以在职工id传递给接口之前对传递的职工id操作一下呢?

即前端传递过来之后,我们在对这些id再进行一次审核,将没有权限管理的职工id删掉可以不?

很幸运,可以

我们可以认为客户端到调用接口这之间存在一个面,在这个面上我们可以处理将要传递给接口的id参数进行处理,将那些没有权限操作的id直接删除。这个面就可以认为是切面,面向切面编程就是这样。

这里只是一个例子,切面不仅存在这种情况中,对象和对象之间,方法和方法之间等等之间都可以认为是一个切面。

那么要怎么实现面向切面编程呢?

这里我们用注解的方式实现

首先就是我们怎么监视这个面呢?
先看下接口

package com.xiaow.springsecuriydemo.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaow.springsecuriydemo.entity.Person;
import com.xiaow.springsecuriydemo.service.PersonService;
import com.xiaow.springsecuriydemo.vo.Result;
import io.jsonwebtoken.lang.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author xiaow
 * @since 2023-09-01
 */
@RestController
@RequestMapping("/person")
public class PersonController {
    @Autowired
    PersonService personService;

    @GetMapping("getPersons")
    public Result getPersons(int adminid, int[] personids) {
        LambdaQueryWrapper<Person> personLambdaQueryWrapper = new LambdaQueryWrapper<>();
        List list1 = Collections.arrayToList(personids);
        personLambdaQueryWrapper.in(Person::getId, list1);
        List<Person> list = personService.list(personLambdaQueryWrapper);
        return Result.succ(list);
    }

}

这里的mplus操作,就交给大家去写了。

来了解下怎么写Aspect

@Before(value = "execution(* com.xiaow.springsecuriydemo.controller.*.*(..))")

Before也就是在接口执行前,我们对其进行操作,com.xiaow.springsecuriydemo.controller就是我们存放controller的包,后面的第一个*代表任意一个Controller,第二个*() 就是任意的方法

其意义就是在com.xiaow.springsecuriydemo.controller下的所有接口执行前,做一步处理,那么处理什么呢?

当然是处理传递的员工id,就是把那些无权限处理的id替代掉,这里我们使用-1来代替,因为id为-1不会指向任何员工信息。

看下完整的代码

package com.xiaow.springsecuriydemo.aop.advice;

import com.xiaow.springsecuriydemo.aop.annotation.ArgsAnnotation;
import com.xiaow.springsecuriydemo.aop.annotation.ArraysAnnotation;
import com.xiaow.springsecuriydemo.entity.Admin;
import com.xiaow.springsecuriydemo.entity.Person;
import com.xiaow.springsecuriydemo.service.AdminService;
import com.xiaow.springsecuriydemo.service.PersonService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

@Aspect
@Component
public class PersonAdvice {
    @Autowired
    AdminService adminService;
    @Autowired
    PersonService personService;

    //  在进入接口之前执行
    @Before(value = "execution(* com.xiaow.springsecuriydemo.controller.*.*(..))")
    public void before(JoinPoint joinPoint) throws IllegalAccessException, NoSuchFieldException {
        final Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        // 获取参数的名字
        final String[] names = methodSignature.getParameterNames();
        // 获取参数的值
        final Object[] args = joinPoint.getArgs();
        int admin_index = -1;
        int personid_index = -1;
        // 获取到adminid和personids的下标位置
        for (int i = 0; i < names.length; i++) {
            if (names[i].equals("adminid")) {
                admin_index = i;
            }
            if (names[i].equals("personids")) {
                personid_index = i;
            }
        }

        Integer adminid = (Integer) args[admin_index];
        int [] personid = (int[]) args[personid_index];
        Admin byId = adminService.getById(adminid);
        if (byId != null) {
            Integer deptid = byId.getDeptid();
            List<Person> byDeptIdAndPersonids = personService.getByDeptIdAndPersonids(deptid, personid);
            int[] personids = (int[]) args[personid_index];
            for (Integer i = 0; i < personids.length; i++) {
                boolean flag = false;
                for (Person byDeptIdAndPersonid : byDeptIdAndPersonids) {
                    if (personids[i] == byDeptIdAndPersonid.getId())
                        flag = true;
                }
//              若不在有权限的id中,则直接设置为-1
                if (!flag)
                    Array.setInt(personid, i, -1);
            }

        }


    }

    // 在接口执行完毕后执行
    @After(value = "execution(* com.xiaow.springsecuriydemo.controller.*.*(..))")
    public void after() {
        System.out.println("after");
    }


}

成果

就这样我们在不修改原有的接口的情况下,实现了权限控制,如下图

AOP到底是啥,java,后端,后端,java,springboot
AOP到底是啥,java,后端,后端,java,springboot文章来源地址https://www.toymoban.com/news/detail-689215.html

到了这里,关于AOP到底是啥的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图,Android面试中常问的MMAP到底是啥东东

    iv.setImageDrawable(animatedVectorDrawable) val animatable = iv.drawable as Animatable animatable.start() } } 输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将

    2024年04月25日
    浏览(50)
  • SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

    1.追根溯源,servlet是啥,tomcat是啥,maven是啥; 2.前后端开发模式,mvc,mvvc,service层的事务; 3.maven对项目全生命周期的管理,打包jar包和运行; 4.springBoot项目的搭建,pom文件,项目结构,项目环境; 5.Druid连接数据库,管理连接,springBootApplication的exclude; 6.banner.text的使用

    2024年02月13日
    浏览(49)
  • Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理

    大家都知道,AOP 底层是动态代理,而 Java 中的动态代理有两种实现方式: 基于 JDK 的动态代理 基于 Cglib 的动态代理 这两者最大的区别在于基于 JDK 的动态代理需要被代理的对象有接口,而基于 Cglib 的动态代理并不需要被代理对象有接口。 那么,Spring 中的 AOP 是怎么实现的

    2024年02月12日
    浏览(37)
  • chromedriver+Selenium+springboot+Java实现后端截图

    chromedriver这种方法实现截图,依赖服务器端的谷歌浏览器软件,需要在服务器端下载谷歌浏览器。 Windows服务器说明 1.下载谷歌浏览器 2.根据第一步下载的谷歌浏览器版本,下载chromedriver,可以在这个页面找到和版本相近的版本去下载https://googlechromelabs.github.io/chrome-for-testin

    2024年01月21日
    浏览(55)
  • 阿里通义千问API(Java)使用教程,基于Springboot后端

    1.1 登录阿里云官网并搜索模型服务灵积,开通key 1.2 点击上图中的控制台并进入 1.3 创建key 2.1 导入以下俩个坐标 2.2 编写Controller层  这里controller层并未将前端的请求数据传入给api中的参数,有需求的可以自己加一下,这里就使用浏览器测试一下看是否返回数据即可  2.3 Ser

    2024年04月09日
    浏览(128)
  • 到底是前端验证还是后端验证

          软件应用研发中, 前端验证还是后端验证这是意识与认知问题。鉴于某些入门同学还不清楚,我们再来看下: 一.  从软件行业来自国外 Q: 前端验证和后端验证都是对同一个数据的验证,有什么区别? A: 二者的目的不同: 前端验证是为了提供更好的用户体验; 后端

    2024年02月04日
    浏览(55)
  • [JavaWeb]【十二】web后端开发-事务管理&AOP

    目录 一、事务管理 1.1 事务回顾 1.2 Spring事务管理 1.2.1 案例  1.2.1.1 EmpMapper新增deleteByDeptId方法  1.2.1.2 DeptServiceImpl   1.2.1.3 启动服务-测试  1.2.2 模拟异常 1.2.3  分析问题  1.2.4 Spring事务管理(一般用在类似多次delete)  1.2.4.1 开启事务开关application.yml 1.2.4.2  DeptServiceImpl 

    2024年02月11日
    浏览(38)
  • 微信小程序-JAVA Springboot项目-后端搭建-项目搭建02

    目录 一、序言 二、后端搭建 三、最终效果         本文主要讲述一个微信小程序前后端项目搭建的过程,主要内容包括小程序(前端)搭建和后端搭建,其中会描述可能遇到的问题以及解决措施,文章将会分为几个部分进行讲述, 这章将讲述后端(Springboot项目)搭建的内

    2024年02月04日
    浏览(49)
  • 【JavaWeb后端开发-第六章(4)】SpringBootWeb案例—事务&AOP

        在数据库阶段我们已学习过事务了,我们讲到:      事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。     怎么样来控制这组

    2024年01月19日
    浏览(55)
  • Java后端开发:SpringBoot项目中的三层架构与代码角色

    目前,大部分后端项目主要目的是暴露功能接口(API)到网络上,由前端程序访问这些接口并获取数据,然后展示在界面上,它们之间遵从Restful规约;还有一部分项目暴露方法,让前端代码实现远程调用,采用的是RPC的思想。 但是无论如何,后端程序存在的意义就是交换、

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包