﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-让自己留下记忆-文章分类-spring</title><link>http://www.blogjava.net/haiqian/category/45986.html</link><description>享受和热爱生活哦</description><language>zh-cn</language><lastBuildDate>Thu, 19 Aug 2010 18:44:24 GMT</lastBuildDate><pubDate>Thu, 19 Aug 2010 18:44:24 GMT</pubDate><ttl>60</ttl><item><title>利用Spring中的AOP做权限管理</title><link>http://www.blogjava.net/haiqian/articles/329417.html</link><dc:creator>hypon</dc:creator><author>hypon</author><pubDate>Thu, 19 Aug 2010 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/haiqian/articles/329417.html</guid><wfw:comment>http://www.blogjava.net/haiqian/comments/329417.html</wfw:comment><comments>http://www.blogjava.net/haiqian/articles/329417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/haiqian/comments/commentRss/329417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haiqian/services/trackbacks/329417.html</trackback:ping><description><![CDATA[AOP在Spring中占有很重要的地位，做了一个例子是利用AOP来做一个登陆的身份验证。。希望能对大家有所帮助，使用了AOP可以在不破坏你的代码的前提下帮你完成验证功能。。<br />
<br />
转一点AOP的知识：<br />
<br />
程序代码: <br />
1、Spring只支持方法拦截，也就是说，只能在方法的前后进行拦截，而不能在属性前后进行拦截。<br />
2、Spring支持四种拦截类型：目标方法调用前（before），目标方法调用后（after），目标方法调用前后（around），以及目标方法抛出异常（throw）。<br />
3、前置拦截的类必须实现MethodBeforeAdvice接口，实现其中的before方法。<br />
4、后置拦截的类必须实现AfterReturningAdvice接口，实现其中的afterReturning方法。<br />
5、前后拦截的类必须实现MethodInterceptor接口，实现其中的invoke方法。前后拦截是唯一可以控制目标方法是否被真正调用的拦截类型，也可以控制返回对象。而前置拦截或后置拦截不能控制，它们不能印象目标方法的调用和返回。<br />
<br />
<br />
<br />
以上可以看出我们要选用实现MethodInterceptor接口的方法来完成这个功能。<br />
代码如下：<br />
接口类的定义：<br />
程序代码: <br />
package com.dragon.study; <br />
public interface ILogin {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void login(String name);<br />
}<br />
<br />
<br />
接口实现类的定义：<br />
程序代码: <br />
package com.dragon.study.Impl; <br />
import com.dragon.study.ILogin;<br />
public class LoginImpl implements ILogin {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Login<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void login(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("欢迎 " + name + "登陆！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
最重要的拦截器的定义：<br />
程序代码: <br />
package com.dragon.Advice; <br />
import org.aopalliance.intercept.MethodInterceptor;<br />
import org.aopalliance.intercept.MethodInvocation;<br />
public class LoginInterceptor implements MethodInterceptor {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Interceptor <br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;public Object invoke(MethodInvocation arg0) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name = (String)arg0.getArguments()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (name.equals("flash")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这才是真正的用户！ ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return arg0.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("非法的用户~~~ ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
ApplicationContext.XML的定义：<br />
&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 />
&nbsp;&nbsp;&lt;property name="proxyInterfaces"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.dragon.study.ILogin&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;loginInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="target"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref bean="loginTarget"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
<br />
<br />
<br />
<br />
OK，以上就是所有代码，下面做一个测试类：<br />
Test类定义：<br />
程序代码: <br />
package com; <br />
import Java.io.*;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.FileSystemXMLApplicationContext;<br />
import com.dragon.study.ILogin;<br />
public class Test {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.XML");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILogin login = (ILogin)ctx.getBean("login");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login.login("flash"); //用户为flash是正确用户，否则是错误的<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}
<img src ="http://www.blogjava.net/haiqian/aggbug/329417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haiqian/" target="_blank">hypon</a> 2010-08-19 22:21 <a href="http://www.blogjava.net/haiqian/articles/329417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>