需求:一个密码生成器有可能生成弱密码,我们需要做的是利用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;
}
}
}
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");
}
}
}
}
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();
}
}
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