一种AOP后置通知的Spring实现案例--密码生成器校验

需求:一个密码生成器有可能生成弱密码,我们需要做的是利用AOP的后置通知功能,在生成密码后校验密码是否为弱类型,如果是则抛出异常

同时,后置通知局限性很大,我们只能在方法返回后执行一些操作,我们不能修改任何关于方法的信息,甚至不能修改他的返回值

 

KeyGenerator.java 假设随机数范围是0,1,2,当生成1的时候我们认为是弱类型

 

package  ch6.SimpleAOP.MethodBeforeAdvisor.KeyGenerator;

import  java.util.Random;

public   class  KeyGenerator  {
   
public static final long WEAK_KEY=0xFFFFFFF00000000L;
   
public static final long STRONG_KEY=0xACDF3FF590AE56L;
   
private Random rand=new Random();
   
public long getKey(){
       
int x=rand.nextInt(3);

       
if(x==1){
           
return WEAK_KEY;
       }
else{
           
return STRONG_KEY;
       }

   }

}

 

 后置通知:实现AfterReturningAdvice接口

 

package  ch6.SimpleAOP.MethodBeforeAdvisor.KeyGenerator;

import  java.lang.reflect.Method;

import  org.springframework.aop.AfterReturningAdvice;

public   class  WeakKEyReturningAdvice  implements  AfterReturningAdvice  {

    
public void afterReturning(Object returnValue, Method method, Object[] obj,
            Object target) 
throws Throwable {
        
if((target instanceof KeyGenerator)&&("getKey".equals(method.getName()))){
             
long key=((Long)returnValue).longValue();
             
if(key==KeyGenerator.WEAK_KEY){
                 
throw new SecurityException("this is a weak_key");
             }

        }


    }


}

测试代码:

 

package  ch6.SimpleAOP.MethodBeforeAdvisor.KeyGenerator;

import  org.springframework.aop.framework.ProxyFactory;

public   class  TestKeyGenerator  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        KeyGenerator keyGen
=getKeyGenerator();
        
        
for (int i = 0; i < 10; i++{
            
try {
                System.out.println(keyGen.getKey());
            }
 catch (Exception e) {
                System.out.println(e.getMessage());
            }

            
        }

        
        
    }

    
    
public static KeyGenerator getKeyGenerator(){
        KeyGenerator target
=new KeyGenerator();
        ProxyFactory pf
=new ProxyFactory();
        
        pf.addAdvice(
new WeakKEyReturningAdvice());
        pf.setTarget(target);

        
return (KeyGenerator)pf.getProxy();
    }


}

 

运行结果:由于随机数不同,每次结果亦不同

48659161790066262
48659161790066262
48659161790066262
this is a weak_key
48659161790066262
48659161790066262
48659161790066262
this is a weak_key
48659161790066262
this is a weak_key

你可能感兴趣的:(一种AOP后置通知的Spring实现案例--密码生成器校验)