精华内容
下载资源
问答
  • Java两种动态代理JDK动态代理和CGLIB动态代理

    万次阅读 多人点赞 2018-08-07 15:33:35
    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 ...代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个...A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP...

    目录

    代理模式

    JDK动态代理

    cglib动态代理

    测试


    代理模式

    代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。

    使用代理好处还不止这些,一个工程如果依赖另一个工程给的接口,但是另一个工程的接口不稳定,经常变更协议,就可以使用一个代理,接口变更时,只需要修改代理,不需要一一修改业务代码。从这个意义上说,所有调外界的接口,我们都可以这么做,不让外界的代码对我们的代码有侵入,这叫防御式编程。代理其他的应用可能还有很多。

    上述例子中,类A写死持有B,就是B的静态代理。如果A代理的对象是不确定的,就是动态代理。动态代理目前有两种常见的实现,jdk动态代理和cglib动态代理。

    JDK动态代理

    jdk动态代理是jre提供给我们的类库,可以直接使用,不依赖第三方。先看下jdk动态代理的使用代码,再理解原理。

    首先有个“明星”接口类,有唱、跳两个功能:

    package proxy;
    
    public interface Star
    {
        String sing(String name);
        
        String dance(String name);
    }
    

    再有个明星实现类“刘德华”:

    package proxy;
    
    public class LiuDeHua implements Star
    {   
        @Override
        public String sing(String name)
        {
             System.out.println("给我一杯忘情水");
    
            return "唱完" ;
        }
        
        @Override
        public String dance(String name)
        {
            System.out.println("开心的马骝");
    
            return "跳完" ;
        }
    }
    

    明星演出前需要有人收钱,由于要准备演出,自己不做这个工作,一般交给一个经纪人。便于理解,它的名字以Proxy结尾,但他不是代理类,原因是它没有实现我们的明星接口,无法对外服务,它仅仅是一个wrapper。

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class StarProxy implements InvocationHandler
    {
        // 目标类,也就是被代理对象
        private Object target;
        
        public void setTarget(Object target)
        {
            this.target = target;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            // 这里可以做增强
            System.out.println("收钱");
            
            Object result = method.invoke(target, args);
            
            return result;
        }
        
        // 生成代理类
        public Object CreatProxyedObj()
        {
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }  
       
    }
    

    上述例子中,方法CreatProxyedObj返回的对象才是我们的代理类,它需要三个参数,前两个参数的意思是在同一个classloader下通过接口创建出一个对象,该对象需要一个属性,也就是第三个参数,它是一个InvocationHandler。需要注意的是这个CreatProxyedObj方法不一定非得在我们的StarProxy类中,往往放在一个工厂类中。上述代理的代码使用过程一般如下:

    1、new一个目标对象

    2、new一个InvocationHandler,将目标对象set进去

    3、通过CreatProxyedObj创建代理对象,强转为目标对象的接口类型即可使用,实际上生成的代理对象实现了目标接口。

            Star ldh = new LiuDeHua();
    
            StarProxy proxy = new StarProxy();
    
            proxy.setTarget(ldh); 
      
            Object obj = proxy.CreatProxyedObj();
            
            Star star = (Star)obj;

    Proxy(jdk类库提供)根据B的接口生成一个实现类,我们成为C,它就是动态代理类(该类型是 $Proxy+数字 的“新的类型”)。生成过程是:由于拿到了接口,便可以获知接口的所有信息(主要是方法的定义),也就能声明一个新的类型去实现该接口的所有方法,这些方法显然都是“虚”的,它调用另一个对象的方法。当然这个被调用的对象不能是对象B,如果是对象B,我们就没法增强了,等于饶了一圈又回来了。

    所以它调用的是B的包装类,这个包装类需要我们来实现,但是jdk给出了约束,它必须实现InvocationHandler,上述例子中就是StarProxy, 这个接口里面有个方法,它是所有Target的所有方法的调用入口(invoke),调用之前我们可以加自己的代码增强。

    看下我们的实现,我们在InvocationHandler里调用了对象B(target)的方法,调用之前增强了B的方法。

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            // 这里增强
            System.out.println("收钱");
            
            Object result = method.invoke(target, args);
            
            return result;
        }

    所以可以这么认为C代理了InvocationHandler,InvocationHandler代理了我们的类B,两级代理。

    整个JDK动态代理的秘密也就这些,简单一句话,动态代理就是要生成一个包装类对象,由于代理的对象是动态的,所以叫动态代理。由于我们需要增强,这个增强是需要留给开发人员开发代码的,因此代理类不能直接包含被代理对象,而是一个InvocationHandler,该InvocationHandler包含被代理对象,并负责分发请求给被代理对象,分发前后均可以做增强。从原理可以看出,JDK动态代理是“对象”的代理。

    下面看下动态代理类到底如何调用的InvocationHandler的,为什么InvocationHandler的一个invoke方法能为分发target的所有方法。C中的部分代码示例如下,通过反编译生成后的代码查看,摘自链接地址。Proxy创造的C是自己(Proxy)的子类,且实现了B的接口,一般都是这么修饰的:

    public final class XXX extends Proxy implements XXX
    

    一个方法代码如下:

    
      public final String SayHello(String paramString)
      {
        try
        {
          return (String)this.h.invoke(this, m4, new Object[] { paramString });
        }
        catch (Error|RuntimeException localError)
        {
          throw localError;
        }
        catch (Throwable localThrowable)
        {
          throw new UndeclaredThrowableException(localThrowable);
        }
    

    可以看到,C中的方法全部通过调用h实现,其中h就是InvocationHandler,是我们在生成C时传递的第三个参数。这里还有个关键就是SayHello方法(业务方法)跟调用invoke方法时传递的参数m4一定要是一一对应的,但是这些对我们来说都是透明的,由Proxy在newProxyInstance时保证的。留心看到C在invoke时把自己this传递了过去,InvocationHandler的invoke的第一个方法也就是我们的动态代理实例类,业务上有需要就可以使用它。(所以千万不要在invoke方法里把请求分发给第一个参数,否则很明显就死循环了)

    C类中有B中所有方法的成员变量

      private static Method m1;
      private static Method m3;
      private static Method m4;
      private static Method m2;
      private static Method m0;
    

    这些变量在static静态代码块初始化,这些变量是在调用invocationhander时必要的入参,也让我们依稀看到Proxy在生成C时留下的痕迹。

    static
      {
        try
        {
          m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
          m3 = Class.forName("jiankunking.Subject").getMethod("SayGoodBye", new Class[0]);
          m4 = Class.forName("jiankunking.Subject").getMethod("SayHello", new Class[] { Class.forName("java.lang.String") });
          m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
          m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
          return;
        }
        catch (NoSuchMethodException localNoSuchMethodException)
        {
          throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
        }
        catch (ClassNotFoundException localClassNotFoundException)
        {
          throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
        }
      }
    

    从以上分析来看,要想彻底理解一个东西,再多的理论不如看源码,底层的原理非常重要。

    jdk动态代理类图如下

    cglib动态代理

    我们了解到,“代理”的目的是构造一个和被代理的对象有同样行为的对象,一个对象的行为是在类中定义的,对象只是类的实例。所以构造代理,不一定非得通过持有、包装对象这一种方式。

    通过“继承”可以继承父类所有的公开方法,然后可以重写这些方法,在重写时对这些方法增强,这就是cglib的思想。根据里氏代换原则(LSP),父类需要出现的地方,子类可以出现,所以cglib实现的代理也是可以被正常使用的。

    先看下代码

    package proxy;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class CglibProxy implements MethodInterceptor
    {
        // 根据一个类型产生代理类,此方法不要求一定放在MethodInterceptor中
        public Object CreatProxyedObj(Class<?> clazz)
        {
            Enhancer enhancer = new Enhancer();
            
            enhancer.setSuperclass(clazz);
            
            enhancer.setCallback(this);
            
            return enhancer.create();
        }
        
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable
        {
            // 这里增强
            System.out.println("收钱");
            
            return arg3.invokeSuper(arg0, arg2);
        } 
    }
    

    从代码可以看出,它和jdk动态代理有所不同,对外表现上看CreatProxyedObj,它只需要一个类型clazz就可以产生一个代理对象, 所以说是“类的代理”,且创造的对象通过打印类型发现也是一个新的类型。不同于jdk动态代理,jdk动态代理要求对象必须实现接口(三个参数的第二个参数),cglib对此没有要求。

    cglib的原理是这样,它生成一个继承B的类型C(代理类),这个代理类持有一个MethodInterceptor,我们setCallback时传入的。 C重写所有B中的方法(方法名一致),然后在C中,构建名叫“CGLIB”+“$父类方法名$”的方法(下面叫cglib方法,所有非private的方法都会被构建),方法体里只有一句话super.方法名(),可以简单的认为保持了对父类方法的一个引用,方便调用。

    这样的话,C中就有了重写方法、cglib方法、父类方法(不可见),还有一个统一的拦截方法(增强方法intercept)。其中重写方法和cglib方法肯定是有映射关系的。

    C的重写方法是外界调用的入口(LSP原则),它调用MethodInterceptor的intercept方法,调用时会传递四个参数,第一个参数传递的是this,代表代理类本身,第二个参数标示拦截的方法,第三个参数是入参,第四个参数是cglib方法,intercept方法完成增强后,我们调用cglib方法间接调用父类方法完成整个方法链的调用。

    这里有个疑问就是intercept的四个参数,为什么我们使用的是arg3而不是arg1?

        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable
        {
            System.out.println("收钱");
            
            return arg3.invokeSuper(arg0, arg2);
        }

     因为如果我们通过反射 arg1.invoke(arg0, ...)这种方式是无法调用到父类的方法的,子类有方法重写,隐藏了父类的方法,父类的方法已经不可见,如果硬调arg1.invoke(arg0, ...)很明显会死循环。

    所以调用的是cglib开头的方法,但是,我们使用arg3也不是简单的invoke,而是用的invokeSuper方法,这是因为cglib采用了fastclass机制,不仅巧妙的避开了调不到父类方法的问题,还加速了方法的调用。

    fastclass基本原理是,给每个方法编号,通过编号找到方法执行避免了通过反射调用。

    对比JDK动态代理,cglib依然需要一个第三者分发请求,只不过jdk动态代理分发给了目标对象,cglib最终分发给了自己,通过给method编号完成调用。cglib是继承的极致发挥,本身还是很简单的,只是fastclass需要另行理解。

    参考

    https://blog.csdn.net/jiankunking/article/details/52143504

    http://www.php.cn/java-article-407212.html

    https://www.cnblogs.com/chinajava/p/5880887.html

    https://rejoy.iteye.com/blog/1627405

    测试

       public static void main(String[] args)
        {
            int times = 1000000;
            
            Star ldh = new LiuDeHua();
            StarProxy proxy = new StarProxy();
            proxy.setTarget(ldh);
            
            long time1 = System.currentTimeMillis();
            Star star = (Star)proxy.CreatProxyedObj();
            long time2 = System.currentTimeMillis();
            System.out.println("jdk创建时间:" + (time2 - time1));
            
            CglibProxy proxy2 = new CglibProxy();
            long time5 = System.currentTimeMillis();
            Star star2 = (Star)proxy2.CreatProxyedObj(LiuDeHua.class);
            long time6 = System.currentTimeMillis();
            System.out.println("cglib创建时间:" + (time6 - time5));
            
            long time3 = System.currentTimeMillis();
            for (int i = 1; i <= times; i++)
            {
                star.sing("ss");
                
                star.dance("ss");
            }
            long time4 = System.currentTimeMillis();
            System.out.println("jdk执行时间" + (time4 - time3));
            
            long time7 = System.currentTimeMillis();
            for (int i = 1; i <= times; i++)
            {
                star2.sing("ss");
                
                star2.dance("ss");
            }
            
            long time8 = System.currentTimeMillis();
            
            System.out.println("cglib执行时间" + (time8 - time7));   
        }

    经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适合单例模式。另外由于CGLIB的大部分类是直接对Java字节码进行操作,这样生成的类会在Java的永久堆中。如果动态代理操作过多,容易造成永久堆满,触发OutOfMemory异常。spring默认使用jdk动态代理,如果类没有接口,则使用cglib。

    展开全文
  • location ^~ / {  proxy_pass http://127.0.0.1:10678;  proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; ...

     

    location ^~ / {

      proxy_pass http://127.0.0.1:10678;

      proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header REMOTE-HOST $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

    展开全文
  • nginx透明代理

    万次阅读 2014-07-29 10:57:17
    最适合透明代理的自然是squid,但squid有两个缺点: 不支持多CPU; 存在内存泄漏问题,我设置squid内存缓存64m,结果睡一觉起来发现squid吃了200m+。 后来听kangzi说nginx也可以架设http代理,所以考虑把...

    在VPN网关上设置一个透明代理能在一定程度上提高客户端的下载速度。最适合做透明代理的自然是squid,但squid有两个缺点:

    1. 不支持多CPU;
    2. 存在内存泄漏问题,我设置squid内存缓存64m,结果睡一觉起来发现squid吃了200m+。

    后来听kangzi说nginx也可以架设http代理,所以考虑把squid换成nginx。

    nginx并不是为正向代理设计的,所以如果你的机器上没有出现上面的两个问题,或者内存不是非常紧张(squid占的内存比nginx多),用squid就行了。

    nginx做透明代理的配置文件分两段,第一段是在http{}里定义内存缓存,nginx自身不支持内存缓存,但linux有特殊的文件系统/dev/shm,将缓存目录指向这里就是用内存做缓存了。示例如下:

    ?View Code BASH
    1
    2
    3
    4
    
    http {
    	proxy_cache_path /dev/shm/nginx/proxy_cache levels=2 keys_zone=mem_cache:64m inactive=7d max_size=64m;
    	proxy_temp_path /dev/shm/nginx/proxy_temp;
    }

    如果缓存在/dev/shm上存不下,nginx会给客户端返回404。
    /dev/shm的大小与内存并不等值,用

    ?View Code BASH
    1
    
    df -h /dev/shm

    可以查看。

    第二段是在server里配置代理。如果VPN客户端有用Dropbox,那么应该设置较长的proxy_xxx_timeout项——Dropbox有一个HTTP的ping-pong机制,服务器响应时间会在60s以上,而nginx默认的timeout都是60s,会返回502 Gateway Timeout,这时客户端就会掉线。示例如下:

    ?View Code BASH
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    server {
    	listen 3128;
    	resolver 8.8.8.8;
    	proxy_cache mem_cache;
    	proxy_max_temp_file_size 4m;
     
    	location / {
    		proxy_pass http://$host$request_uri;
    		proxy_connect_timeout   60;
    		proxy_send_timeout     120;
    		proxy_read_timeout     120;
    	}
    }

    补充:我测试了debian打包的两个版本,0.7.67(squeeze的)和0.8.54(sid的),0.7.67在处理cookie相关的缓存时有bug,0.8.54还没有出现这个问题。

    展开全文
  • 如何做代理

    千次阅读 2011-08-12 17:23:43
    上家关心的是每年的销售额,你完成量后,一般可以再根据量来返点....所以实打实认真销售,你就是一个好的代理商.(对于你自己公司内部管理也是很重要的,带好自己的团队,培养专业精神,那么成功只是时间问题) 一、
     上家关心的是每年的销售额,你完成量后,一般可以再根据量来返点.把精力放在代理产品业务上是最重要的.品牌保护和宣传一般都会有总公司策划.所以实打实认真做销售,你就是一个好的代理商.(对于你自己公司内部管理也是很重要的,带好自己的团队,培养专业精神,那么成功只是时间问题)

    一、三心二意做代理
        现象:甲先生去年代理B产品,做得不好,他今年换做C产品了,但是前一段时间,他找到我说,现在的市场不好做,他已经准备换下C产品,做D产品。他是想想我询问,怎样才能做好一个产品,为什么他的代理的产品总是销量上不去?我告诉他,我认识的现在做的成功的代理商,都是那些和我们已经合作了好多年的代理商。

      分析:实际上,说到底就是个短期投机和长期投资的问题。当然,这和厂商的支持也是有着很大的关系的。真正做市场的厂商一定会找和他们一样的作市场的代理商。康师傅的“市场的精耕细作”就是着眼于此。

      但是从代理商自己的角度来讲一定要为自己代理的产品做个长期的经营规划。只有这样,才有可能把代理当成一个事业做好它。而不是一个短期的投机行为。  

      对策:

      首先:定一个长期的产品代理计划,至少是两年的。

      第二:在自己决定代理之前一定要做好调查和充分的困难估计。

      第三:保持和厂商的良好沟通,很多的情况下,厂商会帮助他们认为的忠诚代理商解决很多的问题。

    二、不去学习代理品牌的经营理念
         现象:今年的早期时候,到南京看市场,看到我们的“每日C”没有按照我们厂商的规定摆放到冰箱里面,而是顺便的和其他的产品摆放在一起,在其后拜访我们的经销商的时候,我把这件事和他说了,问他:“您知道我们今年为什么要投放冰柜吗?”。看到他诧异的眼神,我就知道南京的“每日C”做得不好了。果然,市场基本被统一的“鲜橙多”占据。实际上他做我们的代理商已经有很多年了,可以说是和康师傅一起成长起来的。但是就是这样的多年的代理商对我们的经营理念还是不是很清楚。不知道我们的产品的定位、目标消费对象……

      分析:你想交朋友或者打算和某某长期共处的时候,你都会自然而然的区了解对方的脾气、信念和品格。我们做代理的时候也要去了解代理品牌的经营思路。很多的时候,明明是一个定位很时尚、很高档的产品,被卖的一般低价位的产品一样。让人看了真的是很心疼。

      对策:代理商所代理的品牌在厂商那里都有套系统的经营思路和计划。,代理商应该尽力去理解、接受、坚信它-----本来这是做代理之前就应该做的事情,但是很多的时候不是这样的,很少有人是因为某个企业的经营理念好才去做他的代理的,可是矛盾的事:做了代理之后才发现,这个东西也重要的。

      实际上,大多数的厂商在和代理商签订合同的时候就会把他们的经营理念一同交给了代理商,而且现在愈来愈多的厂商会定期的招集他的代理商来进行培训。别以为取得代理就是皆大欢喜,这才是代理商与厂方、或是二级代理商、以及代理商谈恋爱的开始。

      注意:

      1、 代理品牌的经营理念和和代理商自己的经营思路是树和藤的关系,代理商都得去熟悉。

      2、 原则也好,理念也好,只有把他们贯彻到行动中去才有生命力,否则就是吹牛皮。

    三、执行的方案时目的性不强

      现象:许多的代理商,对很多的事情,即使是自己正在做的事都不知道为什么要这么做,目的是什么?但是那些成功的代理商,上到方针政策,小到售点拜访都带有清晰地、强烈的目的性。

      对策:制定计划。

      现代市场营销非常注重计划,如果说做好市场要走十步路,那么,会做计划表明你已经走了4部了,如果你的业务员也会做计划的话,那说明你们已经走了6部了,剩下的4步就是不折不扣地执行。

      要点:

      1、 养成每个动作都有带有清晰目的的习惯,就是高效率。

      2、 成功就是养成了良好的习惯,形成习惯的方法就是不断的重复。

      3、 每个月填张计划表,而且不是很难。

    四、没有可操作性的考核标准

      现象:很多的代理商在考核他们的业务员的时候,总是感觉这些标准实际操作的时候,很难做到判断准确、公平、公正。都是凭着他们对这个业务员的感觉来打分的。

      分析:有了工作内容,但不知道应该做到什么程度,结果一样是好不到哪儿去,所谓没有规矩,不成方圆。

      我很感激我在康师傅的第一任经理,这位可爱的台湾老头给我上第一堂企划课就交给我一生受益的几个观点:系统的思考问题、做任何事都要给自己定个可量化考核的指标、时时总结、到现场找答案。

      工作内容如果得不到考核与评估,那这种工作本身一定是有问题的。但是制定考核的关键是在与考核指标的量化。只有量化才有可操作性。只有量化才有可考核性。

      对策:

      1、对每个指标都用数据化描述。数字可以帮你了解一切,做到一切。

      2、不检查的工作少做为妙。

      注意:不光你制定了什么样的标准,在一段时间里,或者说在很长的一段时间里面,请你不要去随意的改变它们,多重的标准还不如不制定标准。没有标准意味着蛮干,多重的标准意味着混乱。

    五、喜欢和同一个错误缠绵

      现象:绝大多数的代理商们都会发现他们这次犯的错误和他们上次犯的错误是一样的,而且更悲惨的是:他们知道,下次他们还会犯的。

      分析:所谓的聪明人事不犯同样的错误,他为什么能做到这样呢?因为他们会作总结。

      对策:

      开会,开工作总结会。

      多长时间,你自己决定,但是一个月至少要开一次。

    六、多重目标的促销工作

      现象:这里我可以举这个例子:看了很多次的现场促销活动,我注意到,代理商们经常犯的一个错误就是做A产品的促销的时候,经常把B产品也带着“露露脸”,他们认为是一个系列的产品,这样做可以跟好的利用资源。

      分析:通常情况下,大部分的代理商们做促销活动还是很积极的,但是他们好像总是要得太多了:在一场活动中既想把销量搞上去,又想提升品牌形象,树立消费者品牌偏好。想法都是好的,但正是这些好的想法,导致很多的活动是不伦不类,什么效果都没有很好的体现出来。

      对策:

      1、 目标的单一化,而且一定是可以量化的。

      2、 在一定时间内促销主题要单一、明确;实在不得不做多个主题的促销,也要有个轻重缓急,切忌遍地开花。

      3、 统一促销宣讲内容。

      4、 一定要事后总结,无总结的促销就像吃鸡不喝汤一样

    七、沟通的随意化

      测试:沟通就是业务员、代理商、厂商企划人员的工作。做不好沟通工作的业务员就像耍不好大刀的关公,是很危险的。有很多的人自我感觉良好,真的是这样的吗?可以测试一下:

      1、 你有没有一天内和3个以上的经销商交流过(打电话也可以)?

      2、 你有没有一个月内和50%的经销商交流过(电话也可以)?

      3、 你有没有一个月内实地拜访10个以上的经销商?

      4、 你有没有一周内和所有的业务员的交流过(电话也可以)?

      5、 你有没有一个月内有所有的业务员面对面交流过?

      答案是“是”的加2分,:“没有”的扣1分,合计4分就是合格。

      实际上,合格很简单,两个步骤就行了,但是这两步工作*你是*不住的,*其他的人也是一样的,要*制度;实际上这也是外企管理工作的先进之处。

      对策:

      1、 一周召开一次业务员会议。会议要做记录.(要知道,你总结得愈多,你做得就会愈好)

      2、 一个月召开一次工作会议,会议要做记录。(业务员要人人参加,仓库、售后、财务至少一个代表)

      3、 一个月内找个职工谈心,谈心就是什么都可以谈,要记录

      4、 一天内和三个经销商谈谈,至少打个电话

    八、业务人员变得愈来愈重要

      现象:A代理商一个月的销售量锐减,我们问其原因是因为他的一个业务员走了,而随之而去的,还有大量的客户。

      分析:这是个老问题,我们也已经找到了解决的方法交给了我们的代理商,但是还是得到重视。我这里提出这个问题只是想提醒我们的代理商们行动起来。

      对策:解决的方法就是建立“客户数据库”,使这些客户资源正真的成为公司的资源,而不是某个人的资源。

      1、 每周至少检查每位业务员的客户资料卡一次。

      2、 提醒业务员在访问客户前按规定参加资料卡的内容

      3、 要求业务员在出去访问的时候,只携带当天访问的客户的资料卡

      4、 要求业务员访问会来的时候应缴回卡

      5、 将填写“客户资料卡”视为评估业务员业绩的一个重要的指标。
    展开全文
  • iptables:tproxy透明代理

    万次阅读 2017-08-22 16:16:48
    透明代理:客户端向真实服务器发起连接,代理机冒充服务器与客户端建立连接,并以客户端ip与真实服务器建立连接进行代理转发。因此对于客户端与服务器来说,代理是透明的。
  • SSH反向代理

    万次阅读 2012-01-10 11:06:07
    说实话,我对反向代理这个概念并不熟悉,只是感觉以下要的事是一个代理的逆向过程,故借此名词一用。   问题场景是这样的:我有两套Linux集群的访问权限,分别为A和B,它们互相独立。其中A、B集群均能访问外网...
  • 使用nginx反向代理基本配置方式

    万次阅读 2019-04-28 10:59:12
    在使用nginx反向代理的时候,有三种常用的方案(第一种是常见的一种,而第二和第三种方案则有共同性): 方法一:只替换域名(即使用用户要访问的域名替换掉服务器的IP加端口) 例:访问test....
  • iptables NAT代理上网

    千次阅读 2016-06-30 17:48:25
    在一些场景中,服务器IP...下面通过iptablesNAT代理客户机上网:一、添加 iptables 规则# iptables 做代理 *nat :PREROUTING ACCEPT [4913476026:262512520652] :POSTROUTING ACCEPT [189888265:9905003642] :OUTPUT
  • 用 nodejs 反向代理服务器

    万次阅读 2014-07-15 21:41:32
    时下不少场景,是申请一个 VPS 主机来托管运行 Web 项目的,小弟我也不例外——购买了一个小型的 CentOS VPS 使用着。在使用的过程中,面临一个问题,就是同一类型的服务端环境还好——但如果是一个 PHP、一个 ASP...
  • apache反向代理服务器

    千次阅读 2014-07-07 13:32:19
    apache反向代理服务器 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时...
  • 代理模式的使用总结

    万次阅读 多人点赞 2020-04-20 14:14:37
    一、代理模式 二、静态代理 (一)静态代理 (二)静态代理简单实现 三、动态代理 (一)动态代理 (二)动态代理简单实现 四、动态代理原理分析 五、InvocationHandler接口和Proxy类详解 六、JDK动态代理...
  • nginx svn代理

    千次阅读 2016-11-30 11:13:06
    1、编译安装 nginx tar -zxvf nginx-1.6.3.tar.gz cd nginx-1.6.3 ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid ...
  • 使用Docker容器Jenkins代理节点

    千次阅读 2019-05-03 18:06:58
    文章目录使用Docker容器Jenkins代理节点配置一个Docker节点配置Jenkins Master配置JNLP端口安装Docker插件配置Docker Cloud配置Docker Agent Template在流水线中使用DockerTroubleshooting参考文档 使用Docker容器...
  • 使用SSHSOCKS代理

    千次阅读 2015-05-16 19:00:36
    本文介绍如何使用SSHSOCKS代理,通过Firefox浏览器上网。 首先,必须要有一个SSH账号。 然后,下载并运行PuTTY For Windows,出现PuTTY Configuration界面,默认进入Session选项,在右侧的Host Name(or IP ...
  • 用Knoxhttp代理

    千次阅读 2015-11-25 15:46:31
    其实用Knox可以代理任何http服务或者web app,不仅仅局限于代理hadoop的服务或者web应用/界面。 例如,你可以把tomcat装在一台机器上,然后把knox装在另一台机器上或者...knox就可以作为代理,作为通向tomcat的访问点。
  • linux做代理服务器

    千次阅读 2005-03-11 15:14:00
    一、 准备工作 最好是为Squid建立专用的运行帐号和用户组。...二、 下载: 可以在http://squid.nlanr.net/Squid/ 处下载Squid代理服务器软件。文件名字是 squid-2.2.STABLE3-src.tar.gz。这是一个压缩以后
  • node.js做代理访问外部接口

    千次阅读 2018-09-01 11:54:23
    这里我使用的事express框架 第一步:引入request 安装:npm install --save request var request = require('request') ...以上只是打通这条路了,前端访问node服务器,然后node代理访问别的服务器的接口,实现...
  • 用node服务接口代理转发

    千次阅读 2019-06-14 09:32:15
    前后端分离的项目中,前端项目本地开发的时候需要解决跨域的问题,这个时候可以通过本地启动node服务来进行接口的代理转发。现在将实现的逻辑记录一下。 主要用到的是express和http-proxy-middleware这两个模块 ...
  • 使用Nginx反向代理超时的问题

    千次阅读 2019-06-18 00:00:39
    使用Nginx反向代理时,当被代理服务器没有在指定时间内创建连接、接受请求或返回响应时,Nginx就会断开连接,并返回给客户端“504 Gateway Time-out”错误。 关于Nginx反向代理超时,可以通过proxy_connect_...
  • java动态代理

    万次阅读 2020-12-14 17:59:02
    最近在看一些技术源码的时候,发现很多地方是动态代理, 真可谓是一切皆代理啊,所以我们需要弄明白代理模式这样在看源码的时候会好受很多。 2、基本概念 代理(Proxy)模式提供了间接访问目标对象的方式,即通过...
  • mac 设置代理做抓包调试

    千次阅读 2016-12-03 00:11:27
    mac 设置代理做抓包调试 软件charles 阿里新轮:anyproxy
  • java使用ChromeDriver爬虫时需要做代理,而好多网上的例子用了 browser = new ChromeDriver(cap);这个方法,但这个方法每次都会启动一个新的浏览器,每次我要重新登录,有没有好的办法动态设置代理呢? 伙计们...
  • 一:参考我之前写的那篇cas服务端配置的博客,由于两台服务器,一台做代理,一台身份验证的话,需要引入cas的 cas-server-support-pac4j-webflow cas-server-support-oauth 扩展 详情可以参考 ...
  • ngnix反向代理时文件上传问题

    千次阅读 2017-05-05 09:10:36
    用ngnix反向代理时上传大于2M的文件时无法上传时,查看反向代理配置ngnix.conf,找到对应的域名块,在location下添加client_max_body_size 限制大小(单位M);location / { ..... client_max_body_size 1000M; ...
  • 通常,我们使用Nginx为后端WEB服务反向代理或负载均衡,但如果我们的后端服务,并不是HTTP/HTTPS协议,而是TCP协议或WebSocket协议呢 最近遇到一个需求,我们的HTTPS以及MQTT服务端在海外云主机上,从大陆直连延时...
  • IIS端口穿透或反向代理

    千次阅读 2017-04-10 21:11:31
    今天研究了一下iis反向代理,或者说端口穿透,其实很简单,利用ISAPI_Rewrite_Full版即可实现,反向代理的功用就不介绍了,可以百度一下,下面把具体实现流程写一下: 1.下载ISAPI_Rewrite_Full版本,必须是...
  • nginx反向代理镜像网站小偷站

    千次阅读 2018-01-16 21:43:43
    我们可以通过Nginx的反向代理,来实现山寨或克隆一个网站。 比做小偷站实现起来更简单,因为不用任何网站程序,只需配置Nginx的反向代理即可。 [plain] view plain copy upstream ...
  • linux做代理服务器的方法

    千次阅读 2013-06-12 02:45:37
    Squid可以配置普通上网代理(正向代理)、反向代理、透明代理。系统是CentOS6.2。Squid主机IP为192.168.1.100。 安装squid: yum install squid 安装的版本是squid-3.1.10-1.el6_2.3.i686。 一、正向代理 1、先备份...
  • windows上用apache反向代理

    千次阅读 2017-10-26 16:08:24
    如果有nginx环境,那是很简单的,但是如果没有nginx环境,只有apache环境的话,也可以通过设置一个反向代理服务器,来实现需求。环境 win7 xampp(含apache服务) nodejs(启动一个运行在本地8360端口的服务) 操作...
  • 搭建nginx反向代理内网域名转发

    千次阅读 2018-08-02 21:54:35
    搭建nginx反向代理内网域名转发 一、安装nginx $ sudo yum install nginx 二、修改配置文件 先备份配置文件 $ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak 将配置文件/etc/nginx...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 635,395
精华内容 254,158
关键字:

代理一般都是怎么做