运用spring的aop拦截机制过滤非法字符

运用pring的aop机制可以做到对某些具体方法的拦截和过滤,这里举一个简单的例子,通过运用spring的aop机制实现对非法字符的过滤。

     什么是aop呢?简单的用一句话概括,就是通过proxy,根据你所定义的aspect,把advice根据指定的pointcut织入到你proxy所代理的target中,这就是aop。所以aop基本包含这5个术语。好了,不多说了,我们现在就用具体的例子来实现aop的拦截。

     首先我们定义一个接口,具体代码如下所示

package org.whatisjava.test.aop;

/**
 * 首先定义一个接口
 * @author ij
 *
 */
public interface SomeService {
		
	public String saySome(String msg);
}


    接着对这个接口做一个实现,具体代码如下所示,这个就是要代理的target对象
package org.whatisjava.test.aop;


/**
 * 
 * @author ij
 *
 */
public class SomeServiceImpl implements SomeService {
	
	public String saySome(String msg) {
		return msg; //简单处理,将字符串返回即可
	}

}


接下来定义一个专门用于拦截非法字符的advice,具体代码如下
package org.whatisjava.test.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 能够过滤某些字符的advice
 * @author Lan
 *
 */
public class InterceptorAdvice implements MethodInterceptor {

	public Object invoke(MethodInvocation mi) throws Throwable {
		Object[] args = mi.getArguments(); //通过MethodInvocation可以将调用方法的参数取出
		String str = (String)args[0]; 
System.out.println("---------" + str);
		if("傻X".equalsIgnoreCase(str)) {
			return "请不要说脏话";
		}
		return mi.proceed();
	}

}



这个类要实现MethodInterceptor 这个接口,重写invoke方法,专门对方法中的参数进行拦截,MethodInterceptor 此接口在spring.jar中,如果感兴趣的话可以关注一下源码。

接下来就是最关键的spring的配置文件了,具体内容如下,很好理解
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	
	<!-- Advice-->
	<bean id="interceptorAdvice" class="org.whatisjava.test.aop.InterceptorAdvice"/>
	
	<!-- Target,要代理的目标对象 -->
	<bean id="someService" class="org.whatisjava.test.aop.SomeServiceImpl"/>
	
	
	<!-- Pointcut,对指定的方法名称进行匹配-->
	<bean id="somePointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
		<property name="mappedName">
			<value>saySome</value>
		</property>
	</bean>
	
	<!-- Aspect(Advisor)包括Advice和Pointcut -->
	<bean id="someAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
		<property name="advice">
			<ref bean="interceptorAdvice"/>
		</property>
		
		<property name="pointcut">
			<ref bean="somePointcut"/>
		</property>
	</bean>

    <!-- Proxty包括Target和Aspect(Advisor) -->
	<bean id="someServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target">
			<ref bean="someService"/>
		</property>
		
		<property name="interceptorNames">
			<list>
				<value>someAdvisor</value>
			</list>
		</property>
	</bean>
</beans>


接下来进行测试就可以了,具体代码如下所示
package junit.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.whatisjava.test.aop.SomeService;


public class InterceptorTest {
	
	private static ApplicationContext ctx;
	
	static {
		ctx = new ClassPathXmlApplicationContext("org/whatisjava/test/aop/aopContext.xml");
	}
	
	@Test
	public void tstInterceptor() {
		
		SomeService service = (SomeService)ctx.getBean("someServiceProxy");
		String str = service.saySome("傻X");
		System.out.println(str);
	}
}



运行测试,输入结果“请不要说脏话”,证明拦截成功。

换一个词,比如“你好”,则正常输入。说明此小小的拦截功能实现成功。

你可能感兴趣的:(spring,AOP,框架,bean,JUnit)