前言:給本辦公室做的一個小系統,在阿里雲註冊的域名,由於電腦每天都要重啓,所以會重新分配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不同,就會修改解析,否則不執行。