`
fengfeng925
  • 浏览: 107094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

运用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);
	}
}



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

换一个词,比如“你好”,则正常输入。说明此小小的拦截功能实现成功。
分享到:
评论
8 楼 fengfeng925 2009-10-22  
凤舞凰扬 写道
   一个不错的应用,但是一定要注意过于泛的拦截会导致性能的低下。如果只是过滤或者数据验证,使用filter或validator是更加高效也易扩展的方式

7 楼 fengfeng925 2009-10-22  
YiSingQ 写道
字符的过滤完全可以在web层的过滤器去实现,没必要再让请求进入到Spring的bean中再去拦截,这不是让不好的字符又多通过了一层处理,影响性能,最好就是在请求在我们框架层的尽量最外面的一层做拦截。这个例子作为Spring AOP的教学还是可以的,但是在实际业务处理中并不会这样做。要指出的是Spring AOP的配置文件相对臃肿冗余,业务需求大了以后必将庞大,最好使用自动代理或者是使用注解。

受教了
6 楼 YiSingQ 2009-10-21  
字符的过滤完全可以在web层的过滤器去实现,没必要再让请求进入到Spring的bean中再去拦截,这不是让不好的字符又多通过了一层处理,影响性能,最好就是在请求在我们框架层的尽量最外面的一层做拦截。这个例子作为Spring AOP的教学还是可以的,但是在实际业务处理中并不会这样做。要指出的是Spring AOP的配置文件相对臃肿冗余,业务需求大了以后必将庞大,最好使用自动代理或者是使用注解。
5 楼 凤舞凰扬 2009-10-21  
   一个不错的应用,但是一定要注意过于泛的拦截会导致性能的低下。如果只是过滤或者数据验证,使用filter或validator是更加高效也易扩展的方式
4 楼 whaosoft 2009-10-21  
aop拦截确实比过滤器强
3 楼 fengfeng925 2009-10-19  
aop拦截比过滤器功能强许多,不是那么多回事并不是只有前置、后置、环绕等等什么拦截之类。我写在配置文件里对具体的方法进行拦截。只要写配置方法名就可以了。类选取spring框架提供的类。用过滤器拦截的话,如果我方法多了启不是要写很多if...else,这样好扩展吗?当然个人的方法不同。这只是提供一种建议而已。
2 楼 condeywadl 2009-10-19  
为什么不用过滤器呢 我觉得用AOP拦截不是那回事
1 楼 p2bl 2009-10-19  
用filter也可以吧

相关推荐

    过滤器/拦截器

    在Web开发领域,过滤器(Filter)和拦截器(Interceptor)是两种常见的机制,它们用于在请求被实际处理之前或之后执行特定的操作。这两种技术在Java Web应用中尤为常见,尤其是使用Servlet API或者Spring框架的时候...

    拦截器、过滤器、参数读取坑记录

    拦截器主要用于AOP(面向切面编程)场景,常见于Spring MVC框架中。拦截器的执行流程是在Controller方法调用前后,可以实现诸如权限验证、日志记录、事务管理等功能。与过滤器相比,拦截器更具有面向对象的特性,...

    过滤器与拦截器的区别

    过滤器主要用于预处理请求,例如设置字符编码、过滤非法URL、安全检查等。过滤器是线程安全的,因为它们是为每个请求单独创建的,且只在容器启动时配置一次。 拦截器,另一方面,是基于Java的面向切面编程(AOP)...

    JAVAEE过滤器的使用

    - **安全控制**:过滤非法请求,进行登录验证。 - **字符编码转换**:统一设置请求和响应的编码,避免乱码问题。 - **性能监控**:记录请求时间,分析系统性能瓶颈。 - **日志记录**:记录用户操作,便于后期...

    javaEE项目开发实训设计说明书.doc

    Struts2.x的拦截器和过滤器功能是关键,它们用于处理请求、过滤非法输入并管理应用的流程。同时,解决中文编码问题也是必备技能,确保系统能正确处理中文字符。 2. **Hibernate的使用** Hibernate是一个强大的ORM...

    代码生成器-可自定义模版-guns

    7. 防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 8. 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成...

    SpringSecurity实现图形验证码功能实例代码

    在Spring Security框架中,实现图形验证码功能主要是为了增强应用程序的安全性,防止自动化脚本或恶意攻击者通过自动填充表单进行非法操作。图形验证码是一种常用的身份验证机制,它要求用户输入图片中显示的一段...

    浅谈SpringMVC中Interceptor和Filter区别

    Interceptor分两种情况,一种是对会话的拦截,实现spring的HandlerInterceptor接口并注册到mvc的拦截队列中,其中preHandle()方法在调用Handler之前进行拦截,postHandle()方法在视图渲染之前调用,afterCompletion...

    java 验证码 框架

    通过示例代码,开发者可以了解如何配置拦截器或过滤器来自动处理验证码的验证过程,以及如何在前端展示和接收验证码。 总的来说,Java验证码框架jc为J2EE应用提供了安全验证的解决方案,通过示例代码简化了开发流程...

    Guns后台管理系统-其他

    6、防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 7、简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成...

    Java /JSP代码安全规范

    它通过拦截器、过滤器等机制帮助开发者实现安全控制。 - **Spring MVC**: Spring框架的一个模块,提供了灵活的MVC实现,支持多种视图技术,并且可以通过AOP(面向切面编程)的方式实现安全性的增强。 **2.1.2 会话...

Global site tag (gtag.js) - Google Analytics