支离破碎 发表于 2007-6-5 17:01

[原创][分享]利用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]

支离破碎 发表于 2007-6-5 17:02

<P>-----------------------------------------------------------------------------------------------------</P>
<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]

支离破碎 发表于 2007-6-5 17:03

<P>ApplicationContext.xml的定义:</P>
<P>&lt;beans&gt;<br>&lt;bean id="loginInterceptor" class="com.dragon.Advice.LoginInterceptor"&gt;&lt;/bean&gt;<br>&lt;bean id="loginTarget" class="com.dragon.study.Impl.LoginImpl"&gt;&lt;/bean&gt;<br>&lt;bean id="login" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br>  &lt;property name="proxyInterfaces"&gt;<br>    &lt;value&gt;com.dragon.study.ILogin&lt;/value&gt;<br>  &lt;/property&gt;<br>  &lt;property name="interceptorNames"&gt;<br>    &lt;list&gt;<br>     &lt;value&gt;loginInterceptor&lt;/value&gt;<br>   &lt;/list&gt;<br>  &lt;/property&gt;<br>  &lt;property name="target"&gt;<br>    &lt;ref bean="loginTarget"/&gt;<br>  &lt;/property&gt;<br>&lt;/bean&gt;<br>&lt;/beans&gt;<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]

黄袖标 发表于 2007-6-5 17:05

<P>恩,了解了,其实就是利用的切面来实现了验证,切面这种非侵入式的东西真的不错,可以透明的实现某些逻辑[em05]</P>

支离破碎 发表于 2007-6-5 17:06

论坛怎么不让帖XML文件。。。。只好把XML的头文件删了

黄袖标 发表于 2007-6-5 17:10

没事哦,那东西自己加好了,不过用的时候不加还真不行,我第一次就吃过这样的亏,找了半天没找到原因,后来把dtd定义补上就可以了  [em05]

想你的天空 发表于 2007-6-5 18:48

<P>好贴, 加精阿。<BR> 一般的书上会有的</P>

想你的天空 发表于 2007-6-5 18:52

支离破碎的QQ多少?   加你QQ详细探讨

支离破碎 发表于 2007-6-5 21:39

QQ基本上不了,只有MSN:flash7758@hotmail.com<BR><BR>自己给自己加精.....不太好呵,只是给说一个例子,到时候做权限的时候多一种选择.记得我第一个项目就是用的AOP做的权限,到今天我才体会到..

黄袖标 发表于 2007-6-6 09:32

呵呵,我当初在一个小bbs当bz的时候经常给自己加精置顶加颜色各种的...  [em05]

小邱 发表于 2007-8-21 16:24

[em17] 不错。

nhy520 发表于 2008-3-11 12:14

没明白哈.

页: [1]

编程论坛