关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »通过 Spring AOP 注解实现自动代理

    通过 Spring AOP 注解实现自动代理

    2015-03-13 00:00:00 出处:投稿
    分享

    最近在做一个数据对接项目,通过Hessian与其他企业对接数据。但是公司电脑不能上网只能通过代理上网。如果每个方法都写代理的代码太繁琐,而且项目发布到服务器上的时候服务器是可以上网的。即便通过配置文件配置各个类是否使用代理,但是当发布的时候修改配置文件的内容也会比较多。所以就想到了通过注解+AOP的方式实现自动调用代理。

    HTTP代理接口如下,其中的startProxy()为开始使用代理,endProxy()为结束使用代理,在需要用到的时候开启,不用的时候关闭,这样避免其他不需要使用代理的接口出现问题。

    package com.tiamaes.gjds.proxy;
    
    /**  
     * <p>类描述: Http代理接口</p>
     * <p>创建人:王成委  </p>
     * <p>创建时间:2015年1月16日 上午9:00:53  </p>
     * <p>版权说明:   2015 Tiamaes </p>
     */
    public interface HttpProxy {
    
        public void startProxy();
    
        public void endProxy();
    
        public String getUsername();
    
        public void setUsername(String username);
    
        public String getPassword();
    
        public void setPassword(String password);
    
        public String getHost();
    
        public void setHost(String host);
    
        public int getPort();
    
        public void setPort(int port);
    }

    实现类如下

    package com.tiamaes.gjds.proxy;
    
    import java.net.Authenticator;
    import java.net.PasswordAuthentication;
    
    /**  
     * <p>类描述: Http代理</p>
     * <p>创建人:王成委  </p>
     * <p>创建时间:2015年1月15日 下午5:09:16  </p>
     * <p>版权说明:   2015 Tiamaes </p>
     */
    public class ProxyAuthentication extends Authenticator implements HttpProxy{
        private String username;
        private String password;
        private String host;
        private int port;
    
        public ProxyAuthentication(){
    
        }
    
        public ProxyAuthentication(String host,int port){
            this.host = host;
            this.port = port;
        }
    
        public ProxyAuthentication(String host,int port,String username,String password){
            this.host = host;
            this.port = port;
            this.username = username;
            this.password = password;
        }
    
        public PasswordAuthentication getPasswordAuthentication(){
            return new PasswordAuthentication(username,password.toCharArray());
        }
    
        /**
         * 开始使用代理
         * @author 王成委
         */
        public void startProxy(){
            System.setProperty("http.proxySet", "true");
            System.setProperty("http.proxyHost", host);
            System.setProperty("http.proxyPort", String.valueOf(port));
    
            if(username != null && !"".equals(username))
                Authenticator.setDefault(this);
        }
    
        /**
         * 停止使用代理
         * @author 王成委
         */
        public void endProxy(){
            //System.se
            System.setProperty("http.proxySet", "false");
            System.setProperty("http.proxyHost", "");
            System.setProperty("http.proxyPort", "");
            Authenticator.setDefault(null);
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getHost() {
            return host;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
    }

    注解的代码如下

    package com.tiamaes.gjds.dxp.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**  
     * <p>类描述: 使用代理设置 </p>
     * <pre>:eg
     * @UseProxy
     * public Object getByHttp(){
     *  ......
     * }
     * </pre>
     * <p>创建人:王成委  </p>
     * <p>创建时间:2015年2月9日 下午4:41:27  </p>
     * <p>版权说明:   2015 Tiamaes </p>
     * @see com.tiamaes.gjds.dxp.aop.ProxyManager
     * 
     */
    @Target({ElementType.PARAMETER, ElementType.METHOD})  
    @Retention(RetentionPolicy.RUNTIME)  
    @Documented
    public @interface UseProxy {
    
    }

    AOP切面的代码如下,这个是核心代码,原理就是监控带有UseProxy注解的方法,在方法执行前调用startProxy启动代理在方法执行结束后调用endProxy结束代理。

    package com.tiamaes.gjds.dxp.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    
    import com.tiamaes.gjds.proxy.HttpProxy;
    
    /**  
     * <p>类描述: 通过注解{@link com.tiamaes.gjds.dxp.annotation.UseProxy}配置方法使用Http代理 </p>
     * <p>创建人:王成委  </p>
     * <p>创建时间:2015年2月9日 下午4:42:06  </p>
     * <p>版权说明:   2015 Tiamaes </p>
     * @see com.tiamaes.gjds.dxp.annotation.UseProxy
     */
    @Aspect
    public class ProxyManager {
    
        private HttpProxy httpProxy;
        private boolean proxyEnabled = true;
    
        public void setHttpProxy(HttpProxy httpProxy) {
            this.httpProxy = httpProxy;
        }
    
        public void setProxyEnabled(boolean proxyEnabled) {
            this.proxyEnabled = proxyEnabled;
        }
    
        @Pointcut("@annotation(com.tiamaes.gjds.dxp.annotation.UseProxy)")  
        public void proxyAspect() {
    
        }
    
        @Around("proxyAspect()")
        public Object doInvoke(ProceedingJoinPoint joinPoint) throws Throwable{
            if(httpProxy == null || !proxyEnabled){
                return joinPoint.proceed();
            }
            this.httpProxy.startProxy();
            Object result = joinPoint.proceed();
            this.httpProxy.endProxy();
            return result;
        }
    }

    Spring配置如下

    <bean id="httpProxy" class="com.tiamaes.gjds.proxy.ProxyAuthentication">
            <property name="host" value="192.168.38.69"/>
            <property name="port" value="808" />
            <property name="username" value="user001" />
            <property name="password" value="123456" />
        </bean>
        <bean id="proxyManager" class="com.tiamaes.gjds.dxp.aop.ProxyManager">
            <property name="httpProxy" ref="httpProxy" />
        </bean>

    使用方法如下

     @UseProxy
        @Override
        public List<DriverInfo> GetDriverInfos(List<QueryInfo> queryInfos,
                int page, int pageSize) throws HessianException{
            List<DriverInfo> drivers = null;
            try {
                KeliDriverQueryApi api = this.createApiByUrlKey(KeliDriverQueryApi.API_URL, KeliDriverQueryApi.class);
                drivers = api.GetDriverInfos(queryInfos, page, pageSize);
            } catch (MalformedURLException e) {
                throw new ConnotGetHessianApiException("无法创建远程接口");
            }
            return drivers;
        }

    只需要在方法上面加一个注解就可以实现自动调用HTTP代理。在不需要HTTP代理的时候直接把Spring配置文件中关的内容删掉就可以了,其实直接删除ProxyManager的配置就可以了。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。