正文前先来一波福利推荐:
福利一:
百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。
福利二:
毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。
获取方式:
微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复 百万年薪架构师 ,精品收藏PPT 获取云盘链接,谢谢大家支持!
-----------------------正文开始---------------------------
切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明
切面编程的使用;
1、使用Aspectj的方式进行切面编程;
2、编码环境,spring框架;
3、延伸的 spring中自定义注解的实现;
一、自定义注解:注解用来加在权限控制接口上进行注解处理
//在运行时执行 @Retention(RetentionPolicy.RUNTIME) //注解适用于方法 @Target({ElementType.METHOD}) @Documented @Inherited public @interface Function { //注解的name属性 String value() default ""; }
二、对注解进行切面处理
@Aspect @Component public class RoleAccessConfig { protected boolean isAccessOK(String functionName) { //权限查阅 return false; } protected boolean canAccess(String functionName) { if(functionName != null) { //总是允许访问 //针对名称进行权限查阅判断是否有权限 // if( isAccessOK(functionName) ) { System.out.println(" 具备删除权限 "); return true; }else { System.out.println(" 不具备删除权限 "); return false; } }else{ System.out.println(" 违法访问 "); return false ; } } /**对Controller进行安全和身份校验 */ @Around("within(@org.springframework.stereotype.Controller *) && @annotation (function)") public Object functionAccessCheck(final ProceedingJoinPoint pjp , Function function ) throws Throwable { if (function != null ) { //自动以注解获得注解信息 String functionName = function.value(); if( ! canAccess(functionName )) { //获得数字签名 Signature ms= pjp.getSignature(); //判断是否数据方法签名 if (!(ms instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } //转化为方法签名 MethodSignature msig = (MethodSignature) ms; throw new RuntimeException ("Can not Access !" + msig.getMethod() ); } //继续在切入点处进行操作,也就是有访问权限进入接口处理 Object o = pjp.proceed() ; return o ; }else { Object o = null; return o; } }
三、在spring配置文件中,开启AOP使用配置
<aop:aspectj-autoproxy proxy-target-class="true"/>
只配置这段会报:The prefix "aop" for element "aop:aspectj-autoproxy" is not bound.
需要添加xsd约束:
添加这些有关AOP的配置: xmlns:aop="http://www.springframework.org/schema/aop" 和 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"
四、在Controller中进行添加注解测试;
@RequestMapping(value = "/deleteDayCI.do") @ResponseBody @Function("user") public ReturnResult deleteInfo( @RequestParam(value = "id", required = true) String id ) {
....
}
五、Aspectj用到的jar包:
aspectjrt-1.8.4.jar
aspectjweaver-1.8.3.jar