前言:给本办公室做的一个小系统,在阿里云注册的域名,由于电脑每天都要重启,所以会重新分配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不同,就会修改解析,否则不执行。