代理

作者: 白敏鸢 | 来源:发表于2017-10-11 10:27 被阅读0次
代理的模式分为3种:
静态代理,动态代理,Cglib代理

今天说说静态代理,
动态代理,主要用于字符编码
Cglib代理:没有使用过

在Spring的AOP编程中:
如果加入容器的目标对象有实现接口,用JDK代理,也即是动态代理
如果目标对象没有实现接口,用Cglib代理
静态代理的实现
首先写个接口

public interface agentInterface {
      public void dealTask(String taskName);   
}

第二步:委托类
public class realclass  implements agentInterface{

    
    @Override
    public void dealTask(String taskName) {
    System.out.print("正在处理任务"+taskName);
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
        
    }

}
第三步:代理类
public class proxyClass implements agentInterface {
    //代理类对于委托类的引用。  
    private realclass real;
    public proxyClass(realclass real) {
        this.real=real;
    }

    @Override
    public void dealTask(String taskName) {
          long stime = System.currentTimeMillis();   
          //将请求分派给委托类处理  
          real.dealTask(taskName);  
          long ftime = System.currentTimeMillis();   
          System.out.println("执行任务耗时"+(ftime - stime)+"毫秒");  
            
        
    }

}
第四步:工厂类
public class staticFactory {

    public static agentInterface    getInstance(){
          return new proxyClass(new realclass());  
    }

}

第五步:测试类

public class clients {

    public static void main(String args[])
    {
        agentInterface proxy = staticFactory.getInstance();
        proxy.dealTask("linking!!!!!!!!!!!");
    }
}

动态代理:字符编码

过滤类
public class GetPostEncodingFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
        //强转
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        //创建普通类
        RequestProxy requestProxy = new RequestProxy(request);
        //设置响应类型与编码
        response.setContentType("text/html;charset=UTF-8");
        //发行请求,进入GetPostServlet
        chain.doFilter(requestProxy.getProxy(),response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

代理类
/**
 * @author Administrator
 * 用于产生HttpServletRequest的动态代理对象
 */
class RequestProxy{
    /**
     * 目标对象
     */
    private HttpServletRequest request;
    /**
     * 通过构造器为request设置值
     */
    public RequestProxy(HttpServletRequest request) {
        this.request = request;
    }
    /**
     * 产生HttpServletRequest的代理对象(重点)
     */
    public HttpServletRequest getProxy(){
        return (HttpServletRequest)Proxy.newProxyInstance(
                this.getClass().getClassLoader(), 
                request.getClass().getInterfaces(), 
                new InvocationHandler(){
                    public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
                        Object returnValue = "";
                        String methodName = method.getName();
                        if("getParameter".equals(methodName)){
                            //获取客户端请求的类型
                            String requestType = request.getMethod();
                            //如果是GET请求的话
                            if("GET".equals(requestType)){
                                //获取表单提交的用户名和性别
                                String temp = (String) method.invoke(request,args);
                                //如果非空
                                if(temp!=null && temp.trim().length()>0){
                                    //转还
                                    byte[] buf = temp.getBytes("ISO8859-1");
                                    //手工装配
                                    returnValue = new String(buf,"UTF-8");
                                }
                            //如果是POST请求的话
                            }else if("POST".equals(requestType)){
                                //设置编码方式
                                request.setCharacterEncoding("UTF-8");
                                //获取表单提交的用户名和性别
                                returnValue = method.invoke(request,args);
                            }
                        }else{
                            returnValue = method.invoke(request,args);
                        }
                        return returnValue;
                    }
                });
    }
}

相关文章

  • 正向代理和反向代理(通俗易懂)

    正向代理:代理端代理的是客户端。反向代理:代理端代理的是服务端。 常用案例 正向代理:如VPN代理客户端 反向代理...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • JAVA动态代理的实现方式

    1. 静态代理VS动态代理 代理类可以增强被代理对象的方法。可分为静态代理和动态代理。 1.1 静态代理 静态代理...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • Nginx作为代理服务

    一、代理服务代理-代为办理(代理理财、代理收货等等) 1.1正向代理 1.2反向代理 1.3代理区别 1.4配置语...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 静态代理、动态代理

    代理分为静态代理和动态代理 按照代理创建的时期,可以分为静态代理和动态代理: (1) 静态代理:由程序员或者...

  • Java 代理的实现原理

    一、怎样使用代理 二、代理实现的原理 一、代理分为静态代理和动态代理 静态代理:代理对象获得目标对象的引用 动态代...

  • spring aop

    JDK动态代理和CGLib代理 JDK的代理代理类 被代理接口 被代理实现类 启动类: jdk的动态代理是针对接口...

网友评论

      本文标题:代理

      本文链接:https://www.haomeiwen.com/subject/euviyxtx.html