正文前先来一波福利推荐:

 福利一:

百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的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

posted on 2018-09-29 11:28  小勇DW3  阅读(1263)  评论(0编辑  收藏  举报