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

模拟拦截器

    博客分类:
  • java
阅读更多
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

//方式一 利用递归
public abstract class ActionInvocation {
	private static List<Intercepter> intercepters = new ArrayList<Intercepter>();
	private Iterator<Intercepter> iterator = null;
	private static boolean bool = false;
	public Object resultCode;

	public Object invoke() throws Exception {
		Intercepter intercepter = null;
		// 利用递归,没吃都会执行invoke方法,所以用bool开关来是否第一次执行invoke,如果是则初始化iterator
		if (bool == false) {
			iterator = intercepters.iterator();
			bool = true;
		}
		if (iterator.hasNext()) {
			intercepter = (Intercepter) iterator.next();
			resultCode = intercepter.intercept(this);
		} else {
			resultCode = execute();
			// 还原bool,该功能主要是为了动态新增或删除intercepter
			bool = false;
		}
		return resultCode;
	}

	abstract Object execute();

	public boolean addIntercepter(Intercepter i) {
		if (!intercepters.contains(i)) {
			intercepters.add(i);
			return true;
		} else {
			return false;
		}
	}

	public Object remore(Intercepter i) {
		return intercepters.remove(i);
	}
}

class ActionInvocationImpl extends ActionInvocation {
	Object execute() {
		System.out.println("Hello World!");
		return "Hello World!";
	}
}

class Intercepter {
	private int id;

	public Intercepter(int id) {
		this.id = id;
	}

	public Object intercept(ActionInvocation actionInvocation) throws Exception {
		System.out.println("run the intercept()" + this.id);
		Object resultCode = actionInvocation.invoke();
		System.out.println("after the action run,run the intercept continue  "
				+ this.id);
		return resultCode;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Intercepter other = (Intercepter) obj;
		if (id != other.id)
			return false;
		return true;
	}
}

class Test {
	public static void main(String[] args) throws Exception {
		ActionInvocation action = new ActionInvocationImpl();
		action.addIntercepter(new Intercepter(1));
		action.addIntercepter(new Intercepter(2));
		action.addIntercepter(new Intercepter(3));
		action.invoke();
		// 可以动态新增和删除拦截器
		action.remore(new Intercepter(2));
		action.addIntercepter(new Intercepter(4));
		action.invoke();
	}
}

// 方式二 利用代理

//被代理接口
interface IHello {
	public void say();
}
//被代理接口实现类
class HelloImpl implements IHello {

	public void say() {
		System.out.println("say Hello World!");
	}
}

//拦截器接口
interface IntercepterA {
	void before();

	void after();
}
//日志拦截器类
class LogIntercepter implements IntercepterA {

	public void before() {
		System.out.println("开始");
	}

	public void after() {
		System.out.println("结束");
	}
}
//时间拦截器类
class TimeIntercepter implements IntercepterA {

	long starttime;

	public void after() {
		System.out.println("结束时间为" + new Date());
		System.out.println("方法运行时间为----"
				+ (System.currentTimeMillis() - starttime));
	}

	public void before() {
		System.out.println("开始时间为" + new Date());
		this.starttime = System.currentTimeMillis();
	}

}

//代理类
class MyProxy implements InvocationHandler {

	private Object delegate;

	private List<IntercepterA> intercepterList = new ArrayList<IntercepterA>();

	public Object bind(Object ob) {
		this.delegate = ob;
		return Proxy.newProxyInstance(this.getClass().getClassLoader(), ob
				.getClass().getInterfaces(), this);
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		for (IntercepterA intercepterA : intercepterList) {
			intercepterA.before();
		}
		result = method.invoke(delegate, args);
		for (IntercepterA intercepterA : intercepterList) {
			intercepterA.after();
		}
		return result;
	}

	public void addInterceper(IntercepterA i) {
		this.intercepterList.add(i);
	}

	public void removeInterceper(IntercepterA i) {
		this.intercepterList.remove(i);
	}
}
//测试类
class TestA {
	public static void main(String[] args) {
		MyProxy proxy = new MyProxy();
		proxy.addInterceper(new LogIntercepter());
		proxy.addInterceper(new TimeIntercepter());
		IHello hello = (IHello) proxy.bind(new HelloImpl());
		hello.say();
	}
}

// 两个方式各有优缺点,方式一速度快,但是只能拦截一个方法;方式二利用反射,速度相对慢点,但是可以可以针对所有方法拦截,但是第二个方式也有不好的地方拦截方法分成了before和after和能象第一种合成一体

分享到:
评论

相关推荐

    模拟一个拦截器

    本文将深入探讨“模拟一个拦截器”的主题,结合提供的标签“源码”和“工具”,我们将深入源代码层面理解拦截器的工作原理,并通过实际操作来模拟创建一个自定义的拦截器。 首先,我们需要了解什么是拦截器。在软件...

    模拟activiti的拦截器

    在Activiti中,拦截器是一个强大的工具,允许开发者在流程执行的不同阶段插入自定义的行为,实现对流程实例的细粒度控制。 拦截器的概念源于设计模式中的“命令模式”和“职责链模式”。命令模式将请求封装为一个...

    使用CGLIB模拟spring的拦截器

    在本教程中,我们将深入探讨如何使用CGLIB库来模拟Spring的拦截器功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用,包括Spring AOP。当...

    模拟Struts2拦截器代码

    本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述其工作原理。 首先,我们需要理解Struts2拦截器的基本概念。拦截器是一个实现了`Interceptor`接口的Java类,它位于动作调用之前和之后,...

    运用struts2技术的拦截器实现的页面检测和用户注册

    通常,这会包含一个或多个JUnit测试用例,模拟不同的请求和场景,以确保拦截器按预期工作。 通过上述方式,我们可以利用Struts2的拦截器机制有效地实现页面访问控制和用户注册功能,同时保持代码的清晰和模块化。在...

    网页封包拦截器

    网页封包拦截器是网页封包拦截的利器,是一款完全免费的绿色国产软件,能让您事半功倍,而且是为数不多的几款支持Win7的拦截软件。 网页封包拦截器支持: 2000/XP/2003/Vista/2008/Win7 全系列系统 网页封包拦截器...

    文件拦截器

    此外,调试工具如Postman可用于模拟文件上传下载请求,测试拦截器的效果。 七、最佳实践 1. 避免在拦截器中进行复杂的业务逻辑,保持拦截器的轻量级。 2. 使用配置文件或注解方式动态配置拦截器,以适应不同的应用...

    struts2拦截器实现原理模拟 2013-8-8

    通过这个模拟示例,你将能够理解如何创建自定义拦截器,如何在配置文件中声明它们,以及如何在实际项目中应用拦截器。实践是学习的最佳途径,通过分析和运行代码,你将更深入地了解Struts2拦截器的内部工作原理。 ...

    名为责任链或者拦截器或者过滤器的简单模拟

    看到strut2的Interceptor(拦截器), tomcat源码的Valve(tomcat中各种各样容器如Wrapper,Context都是靠Valve实现各种功能), 以及最早学习到的java web中的javax.servlet.Filter的概念, 都是一种链式的处理流程...

    Struts通过拦截器实现登录后跳转到登录前页面

    Struts是Java Web开发中的一款流行MVC框架,它的核心机制之一就是拦截器(Interceptor)。在Struts2中,拦截器扮演着非常重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如验证、日志、事务管理等。本话题...

    jdk动态代理模拟AOP拦截器

    NULL 博文链接:https://xxjkcyt.iteye.com/blog/1413467

    网络抓包拦截器

    《网络抓包拦截器:揭示数据包的秘密》 在信息技术领域,网络抓包拦截器是一种不可或缺的工具,它能够帮助我们洞察网络通信的底层细节,理解数据如何在网络中传输,并进行必要的调试和分析。本文将深入探讨这个主题...

    SpringMVC拦截器

    SpringMVC 拦截器是 SpringMVC 框架中的一个重要组成部分,它允许开发者在请求被控制器处理之前或之后执行自定义逻辑。拦截器主要用于实现通用功能,如权限验证、日志记录、性能监控等,从而提高代码的复用性和可...

    Struts2单元测试

    通过Mockito或EasyMock等工具,可以创建ActionInvocation的模拟对象来模拟拦截器链的执行。 3. **Result类型测试**:Result类型负责将Action的结果转发到特定的视图或者执行其他后处理操作。测试Result类型通常包括...

    hiro拦截器共13页.pdf.zip

    3. **编写拦截逻辑**:在拦截器中,编写代码来分析请求或响应,可能包括修改请求参数、添加额外的头部、或模拟服务器响应。 4. **测试与调试**:确保拦截器按预期工作,可能需要对不同的网络条件和请求类型进行测试...

    Android-一个简单的OKHttp客户端模拟使用可编程的请求拦截器

    本文将详细解析如何在Android项目中创建一个简单的OKHttp客户端,并利用其可编程的请求拦截器功能进行自定义操作。 首先,我们需要在项目中引入OKHttp的依赖。在`build.gradle`文件的dependencies块中添加以下代码...

    CXF-拦截器-权限控制-登录校验

    测试时,模拟未登录的请求并查看响应,以确保拦截器正常工作。 总的来说,CXF拦截器提供了一种灵活且强大的方式来实现登录校验,增强了Web服务的安全性。通过正确配置和使用拦截器,我们可以确保只有经过身份验证的...

    使用axios拦截器模拟mock服务

    使用axios拦截器模拟mock服务 为什么自己弄个mock?还不是前后端联调过程,后端动不动就重启服务,接口没数据,界面没效果,真的烦。怎么不搞开发环境?我也想啊,就是不搭,诶,无奈!! axios拦截器是什么呢?是在...

    JDK内置动态代理例子

    4. **例子中的模拟拦截器**:在提供的示例中,很可能是创建了一个实现了目标接口的代理对象,并且在`InvocationHandler`的`invoke()`方法内实现了拦截逻辑。例如,可能会在方法调用前打印开始时间,在调用后打印结束...

Global site tag (gtag.js) - Google Analytics