Java实现阿里云的域名解析动态的IP

前言:给本办公室做的一个小系统,在阿里云注册的域名,由于电脑每天都要重启,所以会重新分配IP。于是老是要在阿里云的管理后台修改域名绑定的IP,再解析,终于觉得不耐烦了,尤其是人不在的时候,办公室的妹子们不懂怎么使用,于是做了一个动态解析。

由于对阿里云的接口不熟悉,也是捣鼓了2天半才搞成,主要原因是“百度”的锅,因为在“百度”上查不到好的答案和资料。答案过时,jar包资源缺失,最终在“谷歌”上面找到了方案。


网上找到的代码   (过时

    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  
    import java.net.InetAddress;  
    import java.net.URL;  
    import java.net.URLConnection;  
    import java.util.Date;  
    import java.util.List;  
      
    import com.aliyun.api.AliyunClient;  
    import com.aliyun.api.AliyunConstants;  
    import com.aliyun.api.DefaultAliyunClient;  
    import com.aliyun.api.dns.dns20150109.request.DescribeSubDomainRecordsRequest;  
    import com.aliyun.api.dns.dns20150109.request.UpdateDomainRecordRequest;  
    import com.aliyun.api.dns.dns20150109.response.DescribeSubDomainRecordsResponse;  
    import com.aliyun.api.dns.dns20150109.response.UpdateDomainRecordResponse;  
    import com.aliyun.api.domain.Record;  
      
    public class DemoListDomains {  
        private static AliyunClient client;  
      
        static {  
            String serverUrl = "http://dns.aliyuncs.com/";  
            String accessKeyId = "yourId";  
            String accessKeySecret = "yourSecret";  
      
            client = new DefaultAliyunClient(serverUrl, accessKeyId, accessKeySecret, AliyunConstants.FORMAT_JSON);  
        }  
      
        public static void main(String[] args) {  
              
            while(true){  
                  
                try {  
                    // 获取域名信息  
                    DescribeSubDomainRecordsRequest ddi_req = new DescribeSubDomainRecordsRequest();  
                    ddi_req.setTimestamp(new Date().getTime());  
                    DescribeSubDomainRecordsResponse ddi_resp = new DescribeSubDomainRecordsResponse();  
                    ddi_req.setSubDomain("your域名");  
                    ddi_resp = client.execute(ddi_req);  
      
                    List list = ddi_resp.getDomainRecords();  
                    boolean changed = false;  
                    for (Record record : list) {  
                        String ip = getMyIPOutter();// 获得本机公网IP  
      
                        System.out.println("old_ip : " + record.getValue());  
                        System.out.println("outter_ip : " + ip);  
                        if (!ip.equals(record.getValue())) {  
                            // 根据传入参数修改解析记录  
                            UpdateDomainRecordRequest udr_req = new UpdateDomainRecordRequest();  
                            udr_req.setTimestamp(new Date().getTime());  
                            udr_req.setRecordId(record.getRecordId());  
                            udr_req.setrR(record.getrR());  
                            udr_req.setValue(ip);  
                            udr_req.setType(record.getType());  
                            udr_req.settTL(record.gettTL());  
                            udr_req.setPriority(record.getPriority());  
                            udr_req.setLine(record.getLine());  
                              
                            UpdateDomainRecordResponse udr_resp = new UpdateDomainRecordResponse();  
                            udr_resp = client.execute(udr_req);  
                            if (udr_resp.getErrorCode() == null) {  
                                System.out.println("success");  
                                changed = true;  
                            } else {  
                                System.out.println("error");  
                            }  
                        }  
                          
                    }  
                    if (!changed) {  
                        System.out.println("need not change");  
                    }  
                } catch (Exception e) {  
                    e.printStackTrace();  
                    System.out.println("error");  
                }  
                try {  
                    Thread.sleep(5000);  
                      
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
      
        }  
      
        private static String getMyIPOutter() throws IOException {  
            InputStream ins = null;  
            try {  
                URL url = new URL("http://1212.ip138.com/ic.asp");  
                URLConnection con = url.openConnection();  
                ins = con.getInputStream();  
                InputStreamReader isReader = new InputStreamReader(ins, "GB2312");  
                BufferedReader bReader = new BufferedReader(isReader);  
                StringBuffer webContent = new StringBuffer();  
                String str = null;  
                while ((str = bReader.readLine()) != null) {  
                    if (str.contains("您的IP是:[")) {  
                        webContent.append(str);  
                        break;  
                    }  
                }  
                int start = webContent.indexOf("[") + 1;  
                int end = webContent.indexOf("]");  
                return webContent.substring(start, end);  
            } finally {  
                if (ins != null) {  
                    ins.close();  
                }  
            }  
        }  
      
        @SuppressWarnings("unused")  
        private static String getMyIPLocal() throws IOException {  
            InetAddress ia = InetAddress.getLocalHost();  
            return ia.getHostAddress();  
        }  
    }  

上面这段代码比较老旧,你用起来就会发现缺失“ AliyunClient”的类,还有老旧的执行方式“ execute”,当前jar包不支持,当时,就是这两个问题把我搞晕了,再次fuck“百度”,手动比中指!!!



实现方案:

1、首先你得注册阿里云的域名,并且已实现手动绑定Tomcat服务器IP涉及到修改Tomcat的配置文件,这里我就不说了,网上能查到


Java实现阿里云的域名解析动态的IP_第1张图片


2、需要的 jar包:

aliyun-java-sdk-alidns.jar

aliyun-java-sdk-core.jar

不知道怎么放链接,资源自己去找,百度,谷歌随便了,主要是 aliyun-java-sdk-alidns.jar这个jar包找不到


3、代码

3.1  java代码

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.stereotype.Component;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsRequest;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse.Record;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;


@Component 
public class DDNSTask implements ServletContextListener{
	private Timer timer = null;  
	private static IAcsClient client = null;
	static {
		String regionId = "cn-hangzhou";
		String accessKeyId = "你自己的"; 
		String accessKeySecret = "你自己的";
		IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);  
		client = new DefaultAcsClient(profile);
	}

	private static void aliyunDomain() {
		DescribeDomainRecordsRequest request = new DescribeDomainRecordsRequest();
		request.setDomainName("yourdomain.com");
		DescribeDomainRecordsResponse response;
		try {
			response = client.getAcsResponse(request);
			Record record = response.getDomainRecords().get(0);  
			String old_ip = record.getValue();
			String cur_ip = InetAddress.getLocalHost().toString();
			cur_ip = cur_ip.substring(cur_ip.indexOf("/")+1,cur_ip.length());
			
            if(!old_ip.equals(cur_ip)){
            	UpdateDomainRecordRequest udr_req = new UpdateDomainRecordRequest();
                udr_req.setValue(cur_ip);
                udr_req.setType(record.getType());  
                udr_req.setTTL(record.getTTL());  
                udr_req.setPriority(record.getPriority());  
                udr_req.setLine(record.getLine());  
                udr_req.setRecordId(record.getRecordId());   
                udr_req.setRR(record.getRR());  
                @SuppressWarnings("unused")
				UpdateDomainRecordResponse udr_resp =  client.getAcsResponse(udr_req);
            }else{
            	//System.out.println("不需要修改");
            } 
		} catch (ServerException e1) {
			e1.printStackTrace();
		} catch (ClientException e1) {
			e1.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}       
	}

	@Override
	public void contextDestroyed(ServletContextEvent event) {
		timer.cancel();  
	}

	@Override
	public void contextInitialized(ServletContextEvent event) {
		 timer = new Timer(true);  
		 timer.schedule(new exportHistoryBean(event.getServletContext()), 0,  10 * 1000);  
	}	
	
	static class exportHistoryBean extends TimerTask {
		@SuppressWarnings("unused")
		private ServletContext context;
		
		public exportHistoryBean(ServletContext context) {
			 this.context = context;  
		}

		@Override
		public void run() {  
			aliyunDomain();
		}
	}
}


3.2 web.xml写的监听,启动tomcat就会执行任务

    
    com.cskn.web.common.LoginSessionListener  
  

效果:启动tomcat就会执行心跳更新任务,每10秒查询一次IP,如果之前的IP跟当前IP不同,就会修改解析,否则不执行。

Java实现阿里云的域名解析动态的IP_第2张图片

你可能感兴趣的:(Java,web开发)