通过 spring aop 注解实现自动代理-亚博电竞手机版

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

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

package com.tiamaes.gjds.proxy;  /**    * 

类描述: http代理接口

*

创建人:王成委

*

创建时间:2015年1月16日 上午9:00:53

*

亚博vip888的版权说明: © 2015 tiamaes

*/ 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;  /**    * 

类描述: http代理

*

创建人:王成委

*

创建时间:2015年1月15日 下午5:09:16

*

亚博vip888的版权说明: © 2015 tiamaes

*/ 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;  /**    * 

类描述: 使用代理设置

*
:eg  * @useproxy  * public object getbyhttp(){  *  ......  * }  * 
*

创建人:王成委

*

创建时间:2015年2月9日 下午4:41:27

*

亚博vip888的版权说明: © 2015 tiamaes

* @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;  /**    * 

类描述: 通过注解{@link com.tiamaes.gjds.dxp.annotation.useproxy}配置方法使用http代理

*

创建人:王成委

*

创建时间:2015年2月9日 下午4:42:06

*

亚博vip888的版权说明: © 2015 tiamaes

* @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配置如下

                                                            

使用方法如下

 @useproxy     @override     public list getdriverinfos(list queryinfos,             int page, int pagesize) throws hessianexception{         list 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的配置就可以了。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图