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

springAop实现权限管理数据校验操作日志的场景分析

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

springAop实现权限管理数据校验操作日志的场景分析

前言

作为一个写java的使用最多的轻量级框架莫过于spring,不管是老项目用到的springmvc,还是现在流行的springboot,都离不开spring的一些操作,我在面试的时候问的最多的spring的问题就是我们在平常的项目中使用spring最多的有哪几个点
在我看来无非就两个

  1. spring的bean管理,说的高大上一点就是spring的ioc,di
  2. spring的AOP

spring是一个很强大的轻量级框架,功能远不止这两点,但是我们用的最多的就是这两点。

spring bean 管理

想我们常用的 @Controller @Service @Component 等等都是将我们的bean交给spring管理,我们在获取bean的时候就直接通过 @Resource 就可以获取,当然@Resource 不是spring的,@Autowired 才是spring的,这样我们可以很方便的管理我们的各种bean,使用起来也很方便,不用到处new

springAOP

这个应该是spring面试最常问道的问题了,我面试的时候一般不直接问,我会说一个场景,如果面试者使用过aop立马就可以回答出来。
有这么一个场景,一个系统已经开发完成了,而且已经上线运行了一段时间,很稳定了,现在要加一个功能,就是想收集用户的操作日志,操作日志要比较细致,比如 某某人,在哪个时间点,操作了哪个模块,请求的参数是什么样子的,操作结果如何,等一些比较细致的操作。很多面试者第一时间想到的就是使用过滤器,试想一下,过滤器真的能做到记录这么细致的内容吗?有的可能会想到,我们定义一个公共的方法,所有需要记录日志的地方都去调用这个方法,等等。其实这些都不好,最好的当然是使用aop,使用aop侵入性最小,系统已经稳定运行了,不能去动之前的代码,我们做个aop就可以了,对原来的代码几乎0侵入,对系统影响最小。
那aop实现的方式有哪几种呢?aop实现的步骤又是怎么样的呢?aop还能做些什么呢?这些问题如果在实际项目中使用过,一定能回答出来,如果没有使用过,估计有点难回答,这些都是项目框架的东西,很多公司的项目这一块已经封装好了,很多人直接一直在用,但是没有去查看源码,就不知道具体的实现,实现起来其实也很简单。

接下来我们就以一个小例子来说明下如何使用aop
aop总结起来最常用的就两种方式
1、采用声明的方式来实现(基于XML) 胡子眉毛一把抓,哈哈
2、是采用注解的方式来实现(基于AspectJ)精准定位
我习惯使用注解的方式,更加灵活,使用起来也方便,接下来就以注解的方式来讲下如何使用aop来做权限校验,数据校验,操作日志记录

申明切面

我们使用springaop,首先要将定义的类交给spring管理,然后使用aspectj 定义切面,我们要额外引入
aspectj


 <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.9</version>
</dependency>

@Component
@Aspect
public class OperationInterceptor {

}

定义切点

我们采用注解的方式,那么我们首先要申明一个注解


@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface GlobalInterceptor {

  
  PermissionCodeEnum permissionCode();


  
  OperModuleEnum opObject() default OperModuleEnum.NO_OBJECT;

  
  String opDescription() default "";

}

然后在我们的切面中定义切点


@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
}

定义通知类型

我们要输入还想要输出,那么我们就要将目标方法包围,所以使用around


@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
  	@Around("opMethods()")
  public Object doMethod(ProceedingJoinPoint point) throws BusinessException {
   //TODO 业务代码
   return null;
	}
}

这样一个完整的切面就定义好了

使用切面

在我们的controller中直接使用,我们拿一个登录来讲


@RequestMapping("/login")
@GlobalInterceptor(permissionCode = PermissionCodeEnum.NO_PERMISSION, opObject = OperModuleEnum.OBJECT_LOGIN, opDescription = "登录账号:#{#param1}")
  public AjaxResponseVO login(HttpSession session, @VerifyParam(required = true) String account, @VerifyParam(required = true) String password,@VerifyParam(required = true) String checkCode){

}

我们要传入 切面注解需要的参数
permissionCode 权限编码,我这里定义的是一个枚举,类型自己根据实际情况定义
opObject 操作模块
opDescription 操作描述,这里简单的组织下描述文字,参数的地方使用占位符,到时候根据占位符index获取具体的参数

这样我们在切面中就可以拿到这些参数


@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
  	@Around("opMethods()")
  public Object doMethod(ProceedingJoinPoint point) throws BusinessException {
   Object obj = null;
    try {
      
      SessionUserDto sessionUserDto = getSessionUser();
      
      Object target = point.getTarget();
      
      Object[] arguments = point.getArgs();
      
      String method = point.getSignature().getName();
      
      Class<?>[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();
      
      Method m = target.getClass().getMethod(method, parameterTypes);
      
      GlobalInterceptor interceptor = m.getAnnotation(GlobalInterceptor.class);
      if (null == interceptor) {
        return obj;
      }
      
      if (sessionUserDto != null) {
        validatePermission(interceptor, sessionUserDto);
      }

      
      validateParams(interceptor, m, arguments);

      
      String description = getDescription(arguments, interceptor.opDescription());
      
      obj = point.proceed();

      
      wirteLog(obj, description, interceptor, sessionUserDto);

    } catch (BusinessException e) {
      logger.error("全局拦截器异常", e);
      throw e;
    } catch (Exception e) {
      logger.error("全局拦截器异常", e);
    } catch (Throwable e) {
      logger.error("全局拦截器异常", e);
    }
    return obj;
	}
}

这里只贴出了部分代码,完整的代码可以到这里获取

总结

回到最开始的问题,这样我们实现了一个对原有系统侵入极小,然后又实现了操作日志的解决方案。 我们使用spring的aop非常简单,我们使用aop结合反射,可以做很多事情。aop对代码的侵入非常小,不需要动原来的代码,只需要在原有的方法上加一个注解就可以完成对系统的改造,加权限,加日志 等等一系列操作。

到此这篇关于springAop实现权限管理数据校验操作日志的场景分析的文章就介绍到这了,更多相关springAop权限管理数据校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

springAop实现权限管理数据校验操作日志的场景分析

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

下载Word文档

猜你喜欢

springAop如何实现权限管理数据校验操作日志

小编给大家分享一下springAop如何实现权限管理数据校验操作日志,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言作为一个写java的使用最多的轻量级框架莫过
2023-06-14

编程热搜

  • 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动态编译

目录