[原创][分享]利用Spring中的AOP做权限管理
<P> AOP在Spring中占有很重要的地位,做了一个例子是利用AOP来做一个登陆的身份验证。。希望能对大家有所帮助,使用了AOP可以在不破坏你的代码的前提下帮你完成验证功能。。<br><br>转一点AOP的知识:<br><br>[CODE]<br>1、Spring只支持方法拦截,也就是说,只能在方法的前后进行拦截,而不能在属性前后进行拦截。<br>2、Spring支持四种拦截类型:目标方法调用前(before),目标方法调用后(after),目标方法调用前后(around),以及目标方法抛出异常(throw)。<br>3、前置拦截的类必须实现MethodBeforeAdvice接口,实现其中的before方法。<br>4、后置拦截的类必须实现AfterReturningAdvice接口,实现其中的afterReturning方法。<br>5、前后拦截的类必须实现MethodInterceptor接口,实现其中的invoke方法。前后拦截是唯一可以控制目标方法是否被真正调用的拦截类型,也可以控制返回对象。而前置拦截或后置拦截不能控制,它们不能印象目标方法的调用和返回。<br>[/CODE]<br><br>以上可以看出我们要选用实现MethodInterceptor接口的方法来完成这个功能。<br><br></P>[align=right][color=#000066][此贴子已经被作者于2007-6-5 17:01:56编辑过][/color][/align]
<P>代码如下:</P>
<P>接口类的定义:</P>
<P>[CODE]<br>package com.dragon.study;</P>
<P>public interface ILogin {<br> public void login(String name);<br>}<br>[/CODE]</P>
<P>接口实现类的定义:</P>
<P>[CODE]<br>package com.dragon.study.Impl;</P>
<P>import com.dragon.study.ILogin;</P>
<P>public class LoginImpl implements ILogin {<br> /**<br> * Login<br> */<br> public void login(String name) {<br> System.out.println("欢迎 " + name + "登陆!");<br> }<br>}<br>[/CODE]</P>
<P>最重要的拦截器的定义:</P>
<P>[CODE]<br>package com.dragon.Advice;</P>
<P>import org.aopalliance.intercept.MethodInterceptor;<br>import org.aopalliance.intercept.MethodInvocation;</P>
<P>public class LoginInterceptor implements MethodInterceptor {<br> /**<br> * Interceptor <br> */<br> public Object invoke(MethodInvocation arg0) throws Throwable {<br> String name = (String)arg0.getArguments()[0];<br> if (name.equals("flash")) {<br> System.out.println("这才是真正的用户! ");<br> return arg0.proceed();<br> } else {<br> System.out.println("非法的用户~~~ ");<br> return null;<br> }<br> }<br>}<br>[/CODE]</P>
[align=right][color=#000066][此贴子已经被作者于2007-6-5 17:02:56编辑过][/color][/align]
<P>ApplicationContext.xml的定义:</P>
<P><beans><br><bean id="loginInterceptor" class="com.dragon.Advice.LoginInterceptor"></bean><br><bean id="loginTarget" class="com.dragon.study.Impl.LoginImpl"></bean><br><bean id="login" class="org.springframework.aop.framework.ProxyFactoryBean"><br> <property name="proxyInterfaces"><br> <value>com.dragon.study.ILogin</value><br> </property><br> <property name="interceptorNames"><br> <list><br> <value>loginInterceptor</value><br> </list><br> </property><br> <property name="target"><br> <ref bean="loginTarget"/><br> </property><br></bean><br></beans><br><br><br><br></P>
<P>OK,以上就是所有代码,下面做一个测试类:</P>
<P>Test类定义:</P>
<P>[CODE]<br>package com;</P>
<P>import java.io.*;</P>
<P>import org.springframework.context.ApplicationContext;<br>import org.springframework.context.support.FileSystemXmlApplicationContext;</P>
<P>import com.dragon.study.ILogin;</P>
<P>public class Test {<br> public static void main(String[] args) throws IOException {<br> ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");<br> ILogin login = (ILogin)ctx.getBean("login");<br> login.login("flash"); //用户为flash是正确用户,否则是错误的<br> }<br>}<br>[/CODE]</P><br><br>
[align=right][color=#000066][此贴子已经被作者于2007-6-5 17:05:04编辑过][/color][/align]
<P>恩,了解了,其实就是利用的切面来实现了验证,切面这种非侵入式的东西真的不错,可以透明的实现某些逻辑[em05]</P> 论坛怎么不让帖XML文件。。。。只好把XML的头文件删了 没事哦,那东西自己加好了,不过用的时候不加还真不行,我第一次就吃过这样的亏,找了半天没找到原因,后来把dtd定义补上就可以了 [em05] <P>好贴, 加精阿。<BR> 一般的书上会有的</P> 支离破碎的QQ多少? 加你QQ详细探讨 QQ基本上不了,只有MSN:flash7758@hotmail.com<BR><BR>自己给自己加精.....不太好呵,只是给说一个例子,到时候做权限的时候多一种选择.记得我第一个项目就是用的AOP做的权限,到今天我才体会到.. 呵呵,我当初在一个小bbs当bz的时候经常给自己加精置顶加颜色各种的... [em05] [em17] 不错。 没明白哈.
页:
[1]
