JAVA安全之proxy代理模式的详解

在上一篇文章中,我们学习了反射机制,它可以绕过对java私有访问权限的检查,获取并调用Runtime类来执行命令。而Java内置的jdk动态代理机制处在java.lang.rteflect.proxy包中,其本质实现是通过反射和执行invoke方法来动态获取执行方法。可以总结一下,对比研究一下。


代理模式是Java中最常见的策略模式其一。其特征取决于代理类与授权委托类具备同样的接口,代理类具体承担为授权委托类预备处理消息,进行过滤消息,将消息转发给授权委托类,并对消息开展后续处理。java的代理机制分为静态代理和动态代理,这里具体学习Java内置的jdk动态代理机制。0x03静态代理示例,在谈动态代理之前,我们先来了解一下什么是静态代理。在编译和使用静态代理时,定位1个接口或父类,被代理对象和代理对象实现同一个接口或共同继承同一个父类。我们以1个租房为例。通过上面的例子,我们可以看到静态代理的优势:


在不改变授权委托授权委托类源代码的情况下,我们可以通过AgentRental代理类修改授权委托授权委托类的功能,实现“代理”操控。代理后自定义描述显示,房屋租赁价格有1k-3k的操作方法。然而,这是我们通过代理类实现变更的方法。如果我们需要太多的代理类来修改代理类,可能会出现下图:由此可以知道这种静态代理的缺点:当我们的接口类需要添加和删除时,代理类和代理类都需要更改,不容易维护。同时,如果需要代理多个类,每个授权委托类都要写一个代理类,这样会导致代理类很多,管理起来比较困难。因为java静态代理对类开展操控,所以我们需要1个代理类来更改授权委托类。为了解决这个问题,我们可以使用动态代理在程序运行时自动生成代理类。Java动态代理处在Java.lang.rteflect的包下,通常我们只参照Java.lang.rteflect.Proxy类和InvocationBandlor相互间的接口,用它搭配反射实现动态代理的操控。


InvocationBandlor接口:承担提供调用代理的操控。是由代理对象调用处理器实现的接口,它定位了1个invoke()方法,每个代理对象都有1个关联的接口。当1个方法在一个代理对象上被调用时,它会被自动转发到InvocationBandlor.invoke()方法开展调用。代理类:承担动态构建代理类,提供四种静态方法为一组接口动态生成代理类,并返回代理类的实例对象。

分享: