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<Record> 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的配置文件,這裏我就不說了,網上能查到



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就會執行任務

  <listener>  
    <listener-class>com.cskn.web.common.LoginSessionListener</listener-class>  
  </listener>

效果:啓動tomcat就會執行心跳更新任務,每10秒查詢一次IP,如果之前的IP跟當前IP不同,就會修改解析,否則不執行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章